484 Stimmen

Wie behandeln Python-Funktionen die Arten von Parametern, die Sie übergeben?

Wenn ich mich nicht irre, funktioniert die Erstellung einer Funktion in Python folgendermaßen:

def my_func(param1, param2):
    # stuff

Sie geben jedoch nicht die Typen dieser Parameter an. Wenn ich mich recht erinnere, ist Python eine stark typisierte Sprache, und als solche sollte Python es nicht zulassen, dass Sie einen Parameter eines anderen Typs übergeben, als der Funktionsersteller erwartet. Aber woher weiß Python, dass der Benutzer der Funktion die richtigen Typen übergibt? Stirbt das Programm einfach, wenn es den falschen Typ hat, vorausgesetzt, die Funktion verwendet den Parameter tatsächlich? Müssen Sie den Typ angeben?

9voto

Mark Rushakoff Punkte 236626

Python ist nicht stark typisiert im Sinne einer statischen oder kompilierzeitlichen Typüberprüfung.

Der meiste Python-Code fällt unter die sogenannte "Duck Typing" -- Sie suchen zum Beispiel nach einer Methode read auf ein Objekt - es ist Ihnen egal, ob das Objekt eine Datei auf der Festplatte oder ein Socket ist, Sie wollen nur N Bytes daraus lesen.

8voto

Nick Presta Punkte 27458

Als Alex Martelli erklärt ,

Die normale, pythonische, bevorzugte Lösung ist fast immer "duck typing": Versuchen Sie, das Argument zu verwenden, als ob es von einem bestimmten gewünschten Typ wäre, tun Sie es in einer try/except-Anweisung, die alle Ausnahmen abfängt, die auftreten könnten, wenn das Argument nicht tatsächlich von diesem Typ wäre (oder irgendeinem anderen Typ, der es schön duck-mimicking;-), und in der except-Klausel, versuchen Sie etwas anderes (unter Verwendung des Arguments "als ob" es von einem anderen Typ wäre).

Lesen Sie den Rest seines Beitrags, um hilfreiche Informationen zu erhalten.

5voto

Kyle Punkte 443

Python kümmert sich nicht darum, was Sie an seine Funktionen übergeben. Wenn Sie die Funktion my_func(a,b) Die Variablen param1 und param2 enthalten dann die Werte von a und b. Python weiß nicht, dass Sie die Funktion mit den richtigen Typen aufrufen, und erwartet, dass sich der Programmierer darum kümmert. Wenn Ihre Funktion mit verschiedenen Parametertypen aufgerufen wird, können Sie den Code, der auf sie zugreift, mit try/except-Blöcken umhüllen und die Parameter auf die gewünschte Weise auswerten.

3voto

sprite Punkte 3684

Unabhängig davon, ob Sie einen Typ-Hinweis angeben oder nicht, werden die Dinge zur Laufzeit fehlschlagen.

Sie können jedoch sowohl für die Funktionsargumente als auch für den Rückgabetyp Hinweise auf den Typ geben. Zum Beispiel, def foo(bar: str) -> List[float] weist darauf hin, dass bar als String erwartet wird und die Funktion eine Liste von Float-Werten zurückgibt. Dies führt beim Aufruf der Methode zu einem Fehler bei der Typüberprüfung, wenn die Typen nicht übereinstimmen (vor der Verwendung des Parameters in der Funktion oder des Rückgabetyps). Dies ist IMOHO viel hilfreicher, um solche Fehler abzufangen als ein Fehler über ein fehlendes Feld oder eine fehlende Methode irgendwo im Methodenaufruf. Ich empfehle die Lektüre der offiziellen Python-Dokumentation Tippen - Unterstützung für Typ-Hinweise .

Wenn Sie Typ-Hinweise verwenden, können Sie auch puede statische Typprüfungen verwenden, um die Korrektheit des Codes zu überprüfen. Ein solches Werkzeug, das in Python integriert ist, ist Mypy ( offizielle Dokumentation ). Dieser Abschnitt eines Artikels über statische Typprüfung gibt eine sehr gute Einführung in die Anwendung.

2voto

Justin Ethier Punkte 126797

Sie geben nie den Typ an; Python hat das Konzept der Duckmäuserschreiben Grundsätzlich wird der Code, der die Parameter verarbeitet, bestimmte Annahmen über sie treffen - vielleicht durch den Aufruf bestimmter Methoden, die ein Parameter voraussichtlich implementieren wird. Wenn der Parameter vom falschen Typ ist, wird eine Ausnahme ausgelöst.

Im Allgemeinen liegt es an Ihrem Code sicherzustellen, dass Sie Objekte des richtigen Typs weitergeben - es gibt keinen Compiler, der dies im Voraus erzwingt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X