타입 힌트로 "널링 가능"리턴 타입을 지정하는 방법


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]에 tranformed되어 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 2016 년

@ Michael0x2a는 그 사실을 몰랐습니다. 추가 :)
Dimitris Fasarakis Hilliard

4
나는이 문제를 해결하기 위해 패치 를 제출 했으므로 가까운 장래에 문서가 더 일관성이 있기를 바랍니다.
Michael0x2a

1
Optional[T]유형은 함수형 프로그래밍 커뮤니티에서 잘 알려져 있습니다. 독자는 그것이 의미하는 것을 알 Union[T, None]뿐만 아니라 의미있는 대답이 없거나 오류가 있거나 결과를 찾을 수 없을 때 함수가 None을 반환해야한다는 사용 패턴을 인식 할 것입니다.
wks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.