Wie benutze ich Typhinweise, um eine Funktion zu kommentieren, die eine zurückgibt Iterable
, die immer zwei Werte liefert: a bool
und a str
? Der Hinweis Tuple[bool, str]
ist nah, außer dass er den Rückgabewerttyp auf ein Tupel beschränkt, nicht auf einen Generator oder einen anderen iterierbaren Typ.
Ich bin größtenteils neugierig, weil ich eine Funktion kommentieren möchte, mit der foo()
mehrere Werte wie folgt zurückgegeben werden:
always_a_bool, always_a_str = foo()
Normalerweise funktioniert so foo()
etwas wie return a, b
(was ein Tupel zurückgibt), aber ich möchte, dass der Typhinweis flexibel genug ist, um das zurückgegebene Tupel durch einen Generator oder eine Liste oder etwas anderes zu ersetzen.
python
python-3.x
python-3.5
type-hinting
Richard Hansen
quelle
quelle
Antworten:
Sie geben immer ein Objekt zurück. using gibt
return one, two
einfach ein Tupel zurück.Also ja,
-> Tuple[bool, str]
ist völlig richtig.Nur mit dem
Tuple
Typ können Sie eine feste Anzahl von Elementen mit jeweils einem bestimmten Typ angeben . Sie sollten wirklich immer ein Tupel zurückgeben, wenn Ihre Funktion eine feste Anzahl von Rückgabewerten erzeugt, insbesondere wenn diese Werte bestimmte, unterschiedliche Typen sind.Für andere Sequenztypen wird eine Typspezifikation für eine variable Anzahl von Elementen erwartet , daher
typing.Sequence
ist dies hier nicht geeignet. Siehe auch Was ist der Unterschied zwischen Listen und Tupeln?Das Typ-Hinweis-System von Python folgt dieser Philosophie. Derzeit gibt es keine Syntax, um eine Iterable mit fester Länge anzugeben, die bestimmte Typen an bestimmten Positionen enthält.
Wenn Sie angeben müssen , dass eine iterable Datei ausreicht, können Sie am besten Folgendes tun:
An diesem Punkt kann der Aufrufer Boolesche Werte und Zeichenfolgen in beliebiger Reihenfolge und unbekannter Länge (zwischen 0 und unendlich) erwarten .
quelle
foo()
könnteyield True; yield "blah"
unda, b = foo()
würde noch funktionieren. Oderfoo()
könnte eine Liste zurückgeben. Ich habe meine Frage umformuliert, um deutlich zu machen, dass ich daran interessiert bin, ein beliebiges iterierbares, kein Tupel anzudeuten.typing
undmypy
weitere 2 Mal seit dem Posten erneut überprüft . Ich bin ziemlich sicher, dass ich nichts verpasst habe. Das heißt, es gibt hier auf SO mehrere Stammgäste mit viel Erfahrung mit Python-Hinweisen, die nicht zögern, mich zu korrigieren, wenn sich herausstellt, dass sie falsch sind, oder eine bessere Antwort veröffentlichen.from typing import Tuple
damit die Tupel-Annotation funktioniert.Iterable
und tunUnion
. Da wir hier über ihre spezifische Verwendung sprechen, ist der Import impliziert.