Antworten:
Du suchst Optional
.
Da Ihr Rückgabetyp entweder datetime
(wie von zurückgegeben datetime.utcnow()
) sein kann oder None
Sie Folgendes verwenden sollten Optional[datetime]
:
from typing import Optional
def get_some_date(some_argument: int=None) -> Optional[datetime]:
# as defined
Aus der Dokumentation zum Tippen Optional
geht hervor:
Optional[X]
ist äquivalent zuUnion[X, None]
.
Dabei Union[X, Y]
bedeutet ein Wert vom Typ X
oder Y
.
Wenn Sie aufgrund von Bedenken, über die andere stolpern könnten, explizit sein möchten Optional
und deren Bedeutung nicht erkennen, können Sie immer Folgendes verwenden Union
:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
Aber ich bezweifle, dass dies eine gute Idee Optional
ist, ein indikativer Name ist und ein paar Tastenanschläge erspart.
Wie in den Kommentaren von @ Michael0x2a Union[T, None]
ausgeführt, wird Union[T, type(None)]
so umgewandelt, dass hier keine Verwendung erforderlich ist type
.
Optisch können diese unterschiedlich sein, aber programmatisch ist das Ergebnis in beiden Fällen genau das gleiche . Union[datetime.datetime, NoneType]
wird der in get_some_date.__annotations__
* gespeicherte Typ sein :
>>> from typing import get_type_hints
>>> print(get_type_hints(get_some_date))
{'return': typing.Union[datetime.datetime, NoneType],
'some_argument': typing.Union[int, NoneType]}
* Verwenden Sie typing.get_type_hints
diese Option, um das __annotations__
Attribut der Objekte abzurufen, anstatt direkt darauf zuzugreifen.
Optional[T]
Typ ist in der funktionalen Programmiergemeinschaft bekannt. Der Leser wird nicht nur wissen, dass dies bedeutet Union[T, None]
, sondern auch das Verwendungsmuster erkennen, dass die Funktion None zurückgeben soll, wenn keine aussagekräftige Antwort vorliegt, ein Fehler vorliegt oder das Ergebnis nicht gefunden wird.
Union[datetime, type(None)]
umUnion[datetime, None]
- gemäß PEP 484 wird die VerwendungNone
innerhalb einer Typanmerkung immer als äquivalent zu behandelttype(None)
. (Dietyping
Dokumentation wirdNone
in den meisten Fällen tatsächlich verwendet , hier jedoch nicht, was ein Versehen ist.)