2017-09-22 3 views
0

2 개 있지만 하나의 3 개 튜플을 반환하는 함수가 있습니다. 형식 주석으로 어떻게 설명 할 수 있습니까? 예를 들어Python 유형 주석 : 터플의 항목을 선택 항목으로 표시하십시오.

:

from typing import Tuple 

def example(i): 
    # type: (int) -> Tuple[int, int, <what to put here?>] 
    if i < 10: 
     return (i, i+1, 1) 
    else: 
     return (i, i+1) 

나는 아래와 같은 조합을 사용할 수 있지만, 그것은 아주 지저분한 것 같다.

# type: (int) -> Union[Tuple[int, int], Tuple[int, int, int]] 
+1

두 가지 유형이 있습니다. 아마 노조가 가장 논리적 일 것이다. – Carcigenicate

답변

2

의견에서 지적했듯이 노동 조합이 더 나은 접근 방법 일 수 있습니다. 서명이 지저분 해 보인다면, 당신과 같이 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이 받아 들여 언어에 통합되면 "사용자 정의 클래스"접근 가능성이 더 우아한 될 것입니다).

다른 방법은 기대하고있는 튜플 종류를 미리 알면 함수를 두 개로 나눠서 처리하는 것입니다. 그런 다음 적절한 유형의 함수를 호출하면됩니다.

+0

철저한 답변 주셔서 감사합니다. –

관련 문제