2017-12-09 9 views
0

이 코드가튜플은

>>> x[1:] 
1 <type 'tuple'> 
(slice(1, None, None),) 

을하지만이 튜플 튜플로 인수를 제공합니다

>>> x[1:,2:,3:] 
1 <type 'tuple'> 
((slice(1, None, None), slice(2, None, None), slice(3, None, None)),) 

왜 그렇습니까? 마지막 예제에서 세 슬라이스 요소가 포함 된 튜플을 제공 할 것으로 예상했습니다.

답변

1

__getitem__의 함수 서명은 다음과 같습니다 당신이 개체에 대한 항목 액세스를 수행 할 때마다

def __getitem__(self, key): 
    # ... etc. 

, key__getitem__에 전달되는 하나의 인수 (보통 impled self 함께). -이 세 개의 인수 a, b하지 원인을하지

obj[a,b,c] 

위의 단일 튜플 (a, b, c)key 인수 __getitem__()에로 전달하게됩니다 : 이것은 당신이 다음처럼 작성할 경우에도 마찬가지입니다 그리고 c이 전달됩니다. 하나의 key 인수가 항상 __getitem__에 전달되기 때문에

, 당신의 잘못된 함수 서명 __getitem__(self, *args)에서 argument unpacking의 효과는 args 항상 정확히 하나 개의 항목 (키)를 포함하는 튜플이 될 것입니다. 당신이 조각 구문을 사용하기 때문에 첫 번째 경우에

는, 그 키는 슬라이스입니다 : - x[1:,2:,3:] - 두 번째 경우

|<- slice object ->| 
(slice(1, None, None),) 
|<----- 1-tuple ----->| 

당신의 단일 키가 3 슬라이스 객체의 튜플이다, 인해 잘못된 함수 서명을 한 후 1 튜플에 싸여되는 :

|<- slice object ->| |<- slice object ->| |<- slice object ->| 
|<-------------------------- 3-tuple --------------------------->| 
((slice(1, None, None), slice(2, None, None), slice(3, None, None)),) 
|<--------------------------- 1-tuple ----------------------------->| 

당신은 기존에 __getitem__ 서명을 변경하는 경우 __getitem__(self, key) 양식을 사용하면 두 번째 예제에 필요한 세 개의 슬라이스 객체가 하나의 튜플로 제공됩니다.