파이썬 3.x에서는 다음과 같은 함수의 반환 유형 주석을 사용하는 것이 일반적입니다.
def foo() -> str:
return "bar"
“void”유형에 대한 올바른 주석은 무엇입니까?
3 가지 옵션을 고려 중입니다.
def foo() -> None:
- 논리적 IMO
None
가 아닙니다. 유형이 아니기 때문에
- 논리적 IMO
def foo() -> type(None):
- 내가 아는 최고의 구문을 사용하여
NoneType
,
- 내가 아는 최고의 구문을 사용하여
def foo():
- 명시적인 반환 유형 정보를 생략합니다.
옵션 2는 나에게 가장 논리적으로 보이지만 이미 1의 인스턴스를 보았습니다.
답변
이것은 PEP 484-Type Hints 문서 에서 직접 가져온 것입니다 .
타입 힌트에서 사용되는 경우, 발현은
None
동등한 것으로 간주된다type(None)
.
그리고 보시다시피 대부분의 예제 None
는 반환 유형으로 사용 됩니다.
답변
TLDR : void
반환 유형 주석 의 관용적 등가물 은 -> None
.
def foo() -> None:
...
이것은 함수가 return
없거나 맨손으로 return
평가되는 것과 일치합니다 None
.
def void_func(): # unannotated void function
pass
print(void()) # None
반환 유형을 생략 한다고해서 반환 값이 없다는 의미 는 아닙니다 . 당 PEP 484 :
확인 된 함수의 경우 인수 및 반환 유형에 대한 기본 주석은입니다
Any
.
이는 값이 동적으로 입력 된 것으로 간주되고 모든 작업을 정적으로 지원함을 의미합니다 . 그것은 사실상의 반대 의미입니다 void
.
Python의 유형 힌트는 실제 유형을 엄격하게 요구하지 않습니다. 예를 들어, 주석 유형 이름의 문자열을 사용할 수 있습니다 Union[str, int]
, Union[str, 'int']
, 'Union[str, int]'
다양한 변종은 동일합니다.
마찬가지로 유형 주석은 “다음 중 ” 을 의미하는None
것으로 간주 됩니다NoneType
. 반환 유형에만 사용할 수있는 것이 아니라 여기에서 가장 자주 볼 수 있습니다.
bar : None
def foo(baz: None) -> None:
return None
이것은 제네릭 유형에도 적용됩니다. 예를 들어 None
in Generator[int, None, None]
을 사용 하여 생성기가 값을 가져 오거나 반환하지 않음을 나타낼 수 있습니다 .
PEP 484가 제안에도 불구하고 None
수단을 type(None)
, 당신은 안 명시 적으로 후자의 양식을 사용합니다. 유형 힌트 사양은 않습니다 하지 어떤 형태를 포함한다 type(...)
. 이것은 기술적으로 런타임 표현식이며 지원은 전적으로 유형 검사기에 달려 있습니다. 이 mypy
프로젝트는 484에 대한 지원 을 type(None)
제거하고 제거하는 것을 고려하고 있습니다.
아니면 PEP 484를 업데이트
type(None)
하여 유형으로 유효None
하고 유일한 철자 임을 제안하지 않아야 할까요? 한 가지, 바람직하게는 한 가지 분명한 방법이 있어야합니다.