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.