[python] Python void 반환 유형 주석

파이썬 3.x에서는 다음과 같은 함수의 반환 유형 주석을 사용하는 것이 일반적입니다.

def foo() -> str:
    return "bar"

“void”유형에 대한 올바른 주석은 무엇입니까?

3 가지 옵션을 고려 중입니다.

  1. def foo() -> None:
    • 논리적 IMO None가 아닙니다. 유형이 아니기 때문에
  2. def foo() -> type(None):
    • 내가 아는 최고의 구문을 사용하여 NoneType,
  3. 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

이것은 제네릭 유형에도 적용됩니다. 예를 들어 Nonein Generator[int, None, None]을 사용 하여 생성기가 값을 가져 오거나 반환하지 않음을 나타낼 수 있습니다 .


PEP 484가 제안에도 불구하고 None수단을 type(None), 당신은 명시 적으로 후자의 양식을 사용합니다. 유형 힌트 사양은 않습니다 하지 어떤 형태를 포함한다 type(...). 이것은 기술적으로 런타임 표현식이며 지원은 전적으로 유형 검사기에 달려 있습니다. 이 mypy프로젝트는 484에 대한 지원type(None)제거하고 제거하는 것을 고려하고 있습니다.

아니면 PEP 484를 업데이트 type(None)하여 유형으로 유효 None하고 유일한 철자 임을 제안하지 않아야 할까요? 한 가지, 바람직하게는 한 가지 분명한 방법이 있어야합니다.

JukkaL, 2018 년 5 월 18 일


답변