2015-11-26 9 views
34

Ich habe eine Funktion in Python, die entweder bool oder list zurückgeben kann. Gibt es eine Möglichkeit, die Rückgabetypen mithilfe von Typhinweisen anzugeben?So geben Sie mehrere Rückgabetypen mithilfe von Typhinweisen an

Zum Beispiel, Ist dies der richtige Weg, es zu tun?

def foo(id) -> list or bool: 
     ... 
+2

zurückgegeben werden kann, wie erhalten Sie entweder eine Liste oder einen Boolean? –

+6

@PadraicCunningham Vielleicht ist die Implementierung * Ich schicke dir meine ID, du schickst mir entweder eine Liste oder einen booleschen *: D –

Antwort

47

Vom documentation

Klasse typing.Union

Union Typ; Union [X, Y] bedeutet, entweder X oder Y.

Daraus ergibt sich die richtige Art und Weise mehr als ein Rückgabedatentyp darzustellen, ist

from typing import Union 


def foo(client_id: str) -> Union[list,bool] 

Aber tun, dass die Eingabe beachten wird nicht erzwungen. Python bleibt weiterhin eine dynamisch typisierte Sprache. Die Annotationssyntax wurde entwickelt, um bei der Entwicklung des Codes vor der Freigabe in die Produktion zu helfen. Wie PEP 484 feststellt, "findet zur Laufzeit keine Typüberprüfung statt".

Wie Sie sehen können, übergebe ich einen int-Wert und eine str. Die __annotations__ wird jedoch auf die entsprechenden Werte gesetzt.

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>} 

Bitte gehen für mehr über Typ Hinweise durch PEP 483. Siehe auch What are Type hints in Python 3.5?

Bitte beachten Sie, dass dies nur für Python 3.5 und aufwärts verfügbar ist. Dies wird deutlich in PEP 484 erwähnt.

+0

Gibt es ein Äquivalent in Python 3.4 –

+1

@YahyaUddin Nope - [PEP 484] (https: // www.pythonorg/dev/pep/pep-0484 /): '(.... Es ist nur für Python3.5 nach oben –

+0

Aber ich weiß noch Typ Hinweise 3.4 als auch das heißt 'def foo (id für Python arbeiten. str)'. ist das nicht auch Hinweise geben? –

4

Die Aussage def foo(client_id: str) -> list or bool: bei der Auswertung entspricht def foo(client_id: str) -> list: und wird daher nicht tun, was Sie wollen.

Der native Weg, um einen „entweder A oder B“ Typen Hinweis ist Union (dank Bhargav Rao) zu beschreiben:

def foo(client_id: str) -> Union[list, bool]: 

Ich will nicht die „sein Warum tun Sie dies trotzdem tun wollen "Typ, aber vielleicht mit 2 Rückgabetypen ist nicht, was Sie wollen:

Wenn Sie eine bool zurückgeben möchten, um eine Art von speziellen Fehlerfall anzugeben, sollten Sie stattdessen Ausnahmen verwenden. Wenn Sie das a bool als einen speziellen Wert zurückgeben möchten, wäre vielleicht eine leere Liste eine gute Darstellung. Sie können auch angeben, dass None mit Optional[list]

+2

Es gibt Verwendungszwecke, bei denen das Zurückgeben mehrerer Typen möglich ist, z. B. wenn Sie einige Subtypen, aber keine anderen Subtypen zurückgeben müssen oder wenn Sie versuchen, Daten zu verarbeiten und das Rohformular bei der Verarbeitung zurückgeben möchten ist nicht verfügbar. Wenn Sie Legacy-Code einpacken, kann dies sehr nützlich sein, da es den Upgrade-Prozess unterstützt und/oder unangenehme Stellen erkennt. –

+0

Die Idee der Ausnahmen und der leeren Liste war ebenfalls hilfreich. Vielen Dank –

Verwandte Themen