__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)
양식을 사용하면 두 번째 예제에 필요한 세 개의 슬라이스 객체가 하나의 튜플로 제공됩니다.