여러 반환 값 유형에 주석을 추가하는 방법은 무엇입니까?


113

Iterable항상 두 개의 값을 생성 하는 an 을 반환하는 함수에 주석을 달기 위해 유형 힌트를 사용하는 방법 : a bool및 a str? 힌트 Tuple[bool, str]는 반환 값 유형을 생성기 또는 기타 반복 가능 유형이 아닌 튜플로 제한한다는 점을 제외하고는 가깝습니다.

다음과 같이 foo()여러 값을 반환하는 데 사용되는 함수에 주석을 달고 싶기 때문에 주로 궁금 합니다.

always_a_bool, always_a_str = foo()

일반적으로 (튜플을 반환하는) foo()do 와 같은 기능을 수행 return a, b하지만 반환 된 튜플을 생성 자나 목록 또는 다른 것으로 대체 할 수있을만큼 유형 힌트를 유연하게 만들고 싶습니다.



3
@ StevenM.Vascellaro이 그 질문의 중복되지 않습니다
TWR 콜

답변:


160

항상 하나의 객체를 반환 합니다. 사용 return one, two하면 단순히 튜플을 반환합니다.

네, -> Tuple[bool, str]전적으로 정확합니다.

Tuple 유형은 사용자가 지정할 수 있습니다 고정 된 수의 구별 유형과 요소, 각각. 함수가 고정 된 수의 반환 값을 생성하는 경우 , 특히 해당 값이 특정 고유 유형 인 경우 항상 튜플을 반환해야합니다 .

다른 시퀀스 유형은 가변 개수의 요소에 대해 하나의 유형 사양 을 가질 것으로 예상 되므로 typing.Sequence여기에 적합하지 않습니다. 또한 목록과 튜플의 차이점무엇입니까?를 참조하십시오 .

튜플은 이기종 데이터 구조 (즉, 항목의 의미가 다름) 인 반면 목록은 동종 시퀀스입니다. 튜플에는 구조가 있고 목록에는 순서가 있습니다.

파이썬의 유형 힌트 시스템은 그 철학을 고수하고 있으며, 현재 고정 길이의 반복 가능을 지정하고 특정 위치에 특정 유형을 포함하는 구문이 없습니다.

iterable이 수행하도록 지정 해야하는 경우 수행 할 수있는 최선의 방법은 다음과 같습니다.

-> Iterable[Union[bool, str]]

이 시점에서 호출자는 임의의 순서로 길이를 알 수없는 (0과 무한대 사이의 모든 위치) 부울과 문자열 기대할 수 있습니다 .


2
언어 사양은 다른 반복 가능 객체를 반환 허용; foo()할 수 yield True; yield "blah"있고 a, b = foo()여전히 작동합니다. 또는 foo()목록을 반환 할 수 있습니다. 나는 튜플이 아닌 임의의 반복 가능을 암시하는 데 관심이 있음을 분명히하기 위해 내 질문을 다시 표현했습니다.
Richard Hansen

2
@RichardHansen : 나는 한 재 점검하는 PEP와의 문서 typingmypy게시 이후 다시 2 번; 나는 내가 아무것도 놓친 것이 없다고 확신한다. 즉, 잘못된 것으로 판명되면 주저하지 않거나 더 나은 답변을 게시 할 수있는 Python 유형 힌트 경험이 많은 정규 직원이 여기에 있습니다.
Martijn Pieters

21
from typing import TupleTuple 주석이 작동 하도록 추가 해야했습니다.
PHPirate

3
@PHPirate : 예, IterableUnion. 여기서 특정 용도에 대해 논의하고 있으므로 가져 오기가 암시됩니다.
Martijn Pieters

6
@MartijnPieters, 훌륭한 답변에 감사 드리지만 PHPirate의 의견은 원래 답변으로 편집 할 가치가 있다고 생각합니다.
Tim Mironov
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.