의견에서 지적했듯이 노동 조합이 더 나은 접근 방법 일 수 있습니다. 서명이 지저분 해 보인다면, 당신과 같이 type aliases 사용할 수 있습니다
from typing import Tuple, Union
MyType = Union[Tuple[int, int], Tuple[int, int, int]]
def example1(i):
# type: (int) -> MyType
...snip...
다른 방법은 "indefinite length" Tuple type을 사용하는 것입니다. 기본적으로 튜플의 정확한 길이를 인코딩하는 것을 포기 하겠지만, 교환에서는 리턴 타입을 표준화하고 그 유니온을 피할 수 있습니다. (코드 이 길이에 의존하는 일 경우이 방법이 최선의 방법은 아닙니다.
def example2(i):
# type: (int) -> Tuple[int, ...]
...snip...
그러나 다소 과격한 접근법은 이러한 유형의 상황을 피하기 위해 코드를 재구성하는 것입니다.
결국 두 고유 한 유형을 반환하는 경우 기능 호출자가 어쨌든 길이를 확인해야 할 것입니다. 맞습니까?
그런 경우, 한 가지 아이디어는 튜플을 반환하는 것을 포기하고 대신 NamedTuple 또는 사용자 지정 클래스 중 하나를 반환하는 것입니다. 둘 다 선택적 필드가 있습니다. 그런 다음 "길이"체크를 "이 필드를 없음으로 설정"체크로 변환 할 수 있습니다.
어떤면에서 NamedTuple 접근법은 원래의 요청을 어떤 방식으로도 충족한다고 가정합니다. 단, 튜플/오버 헤드를 변환하는 데 신경 쓰지 않는 한 말입니다.
from typing import NamedTuple, Optional
MyType2 = NamedTuple('MyType2', (
('x', int),
('y', int),
('z', Optional[int]),
))
class MyType3(object):
def __init__(self, x, y, z):
# type: (int, int, Optional[int]) -> None
self.x = x
self.y = y
self.z = z
(PEP 557이 받아 들여 언어에 통합되면 "사용자 정의 클래스"접근 가능성이 더 우아한 될 것입니다).
다른 방법은 기대하고있는 튜플 종류를 미리 알면 함수를 두 개로 나눠서 처리하는 것입니다. 그런 다음 적절한 유형의 함수를 호출하면됩니다.
두 가지 유형이 있습니다. 아마 노조가 가장 논리적 일 것이다. – Carcigenicate