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