타입 힌트를 사용해 복수의 리턴 타입을 지정하는 방법


204

파이썬에서 a bool또는 a 를 반환 할 수있는 함수가 있습니다 list. 유형 힌트를 사용하여 반환 유형을 지정하는 방법이 있습니까?

예를 들어, 이것이 올바른 방법입니까?

def foo(id) -> list or bool:
      ...

5
당신은 어떻게 목록이나 부울로 끝나는가?
Padraic Cunningham

11
@PadraicCunningham 아마도 구현은 내가 당신에게 내 ID를 보내겠다고, 당신은 나에게 목록이나 부울을 보내 : D
Bhargav Rao

아마도 그것은 약한 구현 일 것입니다
Sławomir Lenart

@PadraicCunningham 다형성. 함수가 입력에 상관없이 입력을 검사하는 경우 하나의 변수를 제공 할 때 부울을 얻거나 변수 목록을 제공 할 때 부울 목록을 얻으려고합니다.
Guimoute

답변:


281

로부터 문서

수업 typing.Union

유니온 타입; Union [X, Y]는 X 또는 Y를 의미합니다.

따라서 여러 반환 데이터 형식을 나타내는 적절한 방법은

from typing import Union


def foo(client_id: str) -> Union[list,bool]

그러나 입력은 시행되지 않습니다. 파이썬은 계속해서 동적 타입 언어로 남아 있습니다. 주석 구문은 프로덕션 환경에 출시되기 전에 코드를 개발하는 동안 도움이되도록 개발되었습니다. PEP 484에서 "런타임에는 유형 검사가 수행되지 않습니다"라고 나와 있습니다.

>>> def foo(a:str) -> list:
...     return("Works")
... 
>>> foo(1)
'Works'

보시다시피 int 값을 전달하고 str을 반환합니다. 그러나는 __annotations__해당 값으로 설정됩니다.

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}

를 통해하시기 바랍니다 이동 PEP 483 유형 힌트에 대한 자세한합니다. 또한 참조 파이썬 3.5 입력 힌트는 무엇입니까 ?

이것은 Python 3.5 이상 에서만 사용할 수 있습니다 . 이것은 PEP 484에 명확하게 언급되어 있습니다.


파이썬 3.4에 상응하는 항목이
야야 Uddin

1
@YahyaUddin Nope- PEP 484 : '(.... Python3.5 이상에만 해당
Bhargav Rao

1
@YahyaUddin 정말 놀랍습니다. 우연히 함수 주석 을 의미 했습니까 ?
Bhargav Rao

2
내가 이것을 얻었는지 보자. Python 3.4에는 적용되지 않은 주석 이외의 작업을 수행하지 않는 함수 주석이 있습니다. 그러나 Python 3.5에서는 실제 유형 검사입니다.
Yahya Uddin

1
@BhargavRao, 죄송합니다! 의견 섹션에 남겨 두는 것이 너무 중요하다고 느꼈습니다.
Bobort

26

def foo(client_id: str) -> list or bool:평가시 의 진술 은 def foo(client_id: str) -> list:귀하가 원하는 것과 동일 하므로 귀하가 원하는 것을하지 않을 것입니다.

"A 또는 B"유형 힌트를 설명하는 기본 방법은 Union입니다 (Bhargav Rao 덕분에).

def foo(client_id: str) -> Union[list, bool]:

"어쨌든이 작업을 수행하고 싶은 이유"가되고 싶지는 않지만 2 가지 리턴 유형을 갖는 것이 원하는 것이 아닐 수도 있습니다.

특정 유형의 특수 오류 사례를 나타 내기 위해 부울을 반환하려면 대신 예외 사용을 고려하십시오. 부울을 특별한 값으로 반환하려면 빈 목록이 좋은 표현 일 수 있습니다. 당신은 또한 None함께 반환 될 수 있음을 나타낼 수 있습니다Optional[list]


6
여러 유형을 반환하는 것이 원하는 경우가 있습니다. 예를 들어 일부 하위 유형 중 하나를 반환해야하지만 다른 하위 유형은 반환하지 않는 경우 또는 데이터를 처리하려고 시도하고 처리가 아닌 경우 원시 형식을 반환하려는 경우 사용할 수 없습니다. 또한 레거시 코드를 래핑하는 경우 업그레이드 프로세스에 도움이되고 어색한 위치를 볼 수 있기 때문에 매우 유용 할 수 있습니다.
Nathaniel Ford

예외와 빈 목록 아이디어도 도움이되었습니다. 감사
야야 Uddin

20

"여러 반환 값의 유형을 지정하는 방법"을 검색하기 위해 여기에 착륙 한 사람이있는 경우 Tuple[type_value1, ..., type_valueN]

from typing import Tuple

def f() -> Tuple[dict, str]:
    a = {1: 2}
    b = "hello"
    return a, b

자세한 정보 : https://code-examples.net/en/q/2651e60

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.