Як вказати тип "нульового" повернення з підказками типу


177

Припустимо, у мене є функція:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

Як вказати тип повернення для того, що може бути None?

Відповіді:


279

Ви шукаєте Optional.

Оскільки ваш тип повернення може бути datetime(як повернуто з datetime.utcnow()), або Noneви повинні використовувати Optional[datetime]:

from typing import Optional

def get_some_date(some_argument: int=None) -> Optional[datetime]:
    # as defined

З документації щодо набору тексту - Optionalце скорочення для:

Optional[X]еквівалентно Union[X, None].

де Union[X, Y]означає значення типу Xабо Y.


Якщо ви хочете бути явними через побоювання, що інші можуть натрапити на себе Optionalі не усвідомлювати, що це сенс, ви завжди можете використовувати Union:

from typing import Union

def get_some_date(some_argument: int=None) -> Union[datetime, None]:

Але я сумніваюсь, що це гарна ідея, Optionalорієнтовна назва і це врятує пару натискань клавіш.

Як вказувалося в коментарях від @ Michael0x2a Union[T, None], трансформується Union[T, type(None)]так, що тут не потрібно використовувати type.

Візуально вони можуть відрізнятися, але програмно, в обох випадках результат точно такий же ; Union[datetime.datetime, NoneType]буде тип, що зберігається у get_some_date.__annotations__* :

>>> 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]}

* Використовуйте, typing.get_type_hintsщоб схопити __annotations__атрибут об'єктів, а не отримувати прямий доступ до нього.


10
Ви можете спростити Union[datetime, type(None)]до Union[datetime, None]- по PEP 484 , використовуючи Noneв якості анотації типу завжди розглядається як еквівалент type(None). ( typingДокументація насправді використовується Noneв більшості випадків, але тут немає, що є недоліком).
Michael0x2a

@ Michael0x2a цього не знав, цікаво. Додав це :)
Dimitris Fasarakis Hilliard

4
Я пішов вперед і подав патч, щоб виправити це зараз, тож сподіваюся, що документи найближчим часом будуть більш послідовними щодо цього!
Michael0x2a

1
Optional[T]Типу добре відомий в співтоваристві функціонального програмування. Читач не тільки дізнається, що це означає Union[T, None], але й розпізнає схему використання, що функція поверне функцію None, коли немає змістовної відповіді, є помилка або результат не знайдений.
wks
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.