2017-02-06 1 views
2

__getitem__ dunder 메서드를 제공하는 바이트의 하위 클래스가 있습니다. __getitem__ 메서드는 항상 Python 3.5에서 호출되지만 Python 2.7에서는 비 슬라이스 키에만 호출됩니다. 대신 부모의 __getitem__이 인스턴스에 적용된 것으로 보입니다. 이유가 무엇이며 해결 방법이 있습니까?__getitem__이 파이썬 3.5에서는 호출되었지만 파이썬 2.7에서는 호출되지 않는 이유는 무엇입니까?

코드

class A(object): 
    def __getitem__(self, key): 
     print("in A.__getitem__ with key " + str(key)) 
     return [] 

class B(bytes): 
    def __getitem__(self, key): 
     print("in B.__getitem__ with key " + str(key)) 
     return [] 

if __name__ == "__main__": 
    import sys 
    print(sys.version) 

    a = A() 
    b = B() 

    print("[0]") 
    a[0] 
    b[0] 

    print("[0:1]") 
    a[0:1] 
    b[0:1] 

    print("[:1]") 
    a[:1] 
    b[:1] 

파이썬 3.5 출력은

클래스 정의 __getitem__는 항상라고합니다.

(venv) snafu$ python ./x.py 
3.5.2 (default, Nov 17 2016, 17:05:23) 
[GCC 5.4.0 20160609] 
[0] 
in A.__getitem__ with key 0 
in B.__getitem__ with key 0 
[0:1] 
in A.__getitem__ with key slice(0, 1, None) 
in B.__getitem__ with key slice(0, 1, None) 
[:1] 
in A.__getitem__ with key slice(None, 1, None) 
in B.__getitem__ with key slice(None, 1, None) 

파이썬 2.7 출력

클래스 정의 __getitem__ 만이 아닌 슬라이스 키 위해 호출되는.

(venv2.7) snafu$ python x.py 
2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] 
[0] 
in A.__getitem__ with key 0 
in B.__getitem__ with key 0 
[0:1] 
in A.__getitem__ with key slice(0, 1, None) 
[:1] 
in A.__getitem__ with key slice(None, 1, None) 
+0

Doh! 명시 적 슬라이스 (예 :'b [slice (0,1, None)])를 호출하는'__getitem__ ') *은 파이썬 2.7과 3.5 모두에서 작동합니다. 파이썬 2.7에서 b가 내장형의 서브 클래스 일 때'b [s : e]'를 쓰는 것은'b [slice (s, e)] '와 같은 것이 아닙니다. – Reece

답변

6

파이썬 2는 본 경우 무단 슬라이싱 __getitem__보다 우선 __getslice__을 갖는다. 파이썬 3에서는 사라졌습니다.

관련 문제