2017-11-08 18 views
1

시퀀스 (예 : 목록)의 경우 __getitem__() 메서드는 단일 항목 또는 항목 시퀀스를 반환 할 수 있습니다. 예를 들어, 함수 장식 아래 :__getitem에 대한 올바른 유형 힌트 __()

def __getitem__(self, index) -> Union[Product, Generator[Product, None, None]]: 
    return super(Products, self).__getitem__(index) 

사용 예제 :

i1 = 34 
for product in products[i1:]: 
    print(product.name) 

내가 올바른 것으로 Union[Product, Generator[Product, None, None]]을 생각하지만, PyCharm 플래그이 같은 부적절한. 타이핑 라이브러리를 오용하고 있습니까? 아니면 PyCharm 문제입니까?

감사합니다.

+4

'생성자'는 생성자 용이며 시퀀스 용입니다. – user2357112

+0

그게 효과가 있지만 다른 질문 - 목록 또는 시퀀스? 표준 문서의 경우 : 1. [데이터 모델] (https://docs.python.org/3.5/reference/datamodel.html#the-standard-type-hierarchy)에 다음과 같이 명시되어 있습니다. "표현식으로 사용될 때, 슬라이스는 동일한 유형의 시퀀스입니다. 2. [typing] (https://docs.python.org/3/library/typing.html#typing.List)은 "List (list, MutableSequence [T]) 리스트의 일반적인 버전. 리턴 타입에 주석을 달 때 유용합니다. 인자에 주석을 달려면 매핑, 시퀀스 또는 AbstractSet과 같은 추상 콜렉션 유형을 사용하는 것이 가장 좋습니다. " – hansonap

답변

1

__getitem__()에 대한 올바른 유형 힌트는 Union[Product, Sequence[Product, None, None]]입니다.

docs에 문서화되어있는 유일한 곳은 data model page입니다. "표현식으로 사용하면 슬라이스는 같은 유형의 시퀀스입니다." 참고 : 시퀀스와 같은 유형 (예 : List)은 (typing 참조)에서도 작동해야합니다.

추가 토론 : 더 많은 메모리를 효율적으로 사용할 수 있기 때문에 반복되는 동안 시퀀스가있는 슬라이스를 사용할 때 생성기가 예상됩니다. 그러나 이제는 이것이 항상 끊임없이해야하는 결과를 낳을 것입니다. l_2 = list(l_1[2:]) 이것은 성가시다.