Python void 반환 유형 주석


114

파이썬 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의 인스턴스를 보았습니다.


12
FWIW, Python에는 void반환 유형 이있는 함수가 없습니다 . 명시 적없는 모든 함수 (또는 함수의 분기)는를 return반환 None합니다. 나는 OP가 이해한다고 가정한다.이 코멘트는 대부분 미래 독자의 이익을위한 것이다 ...
PM 2Ring

글쎄,이 질문은 "왜 내 함수가 파이썬에서 None을 반환합니까?"만큼 인기가 없습니다. (이 질문을 만들었습니다) 따라서 대부분의 독자는 이미 기본 동작을 알고 있습니다. 딜레마 1 대 2는 답에서 해결됩니다. 하지만 3은 어떻습니까? "절차"의 경우 실제로 쓸모없는 혼란없이 옵션 3을 선호합니다 (결국이 함수는 아무것도 반환하지 않음).
Tomasz Gandor

@TomaszGandor 동의합니다. 함수 나 메서드에 return 문이 없으면 반환 유형을 지정할 필요가 없습니다.
Jeyekomon 19

답변:


126

이것은 PEP 484-Type Hints 문서 에서 직접 가져온 것입니다 .

타입 힌트에서 사용되는 경우, 발현은 None동등한 것으로 간주된다 type(None).

그리고 보시다시피 대부분의 예제 None는 반환 유형으로 사용 됩니다.


22
명확히하기 위해 위의 옵션 1을 선택하십시오.
Adam Nelson

6
NoReturn 유형 python.org/dev/peps/pep-0484/#the-noreturn-type은 어떻습니까?
asmaier

13
@asmaier PEP 484 를 인용 하는 이 질문 에 따르면 — 유형 힌트 NoReturn 유형은 "... 정상적으로 반환되지 않는 함수에 주석을 달기 위해 사용됩니다. 예를 들어 무조건 예외를 발생시키는 함수 ..."
Rodrigo Laguna

39

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 일


4
세 번째 옵션이 실제로 무효 기능이 아닌 이유를 설명하기 위해 큰 소리로 외칩니다.
никта
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.