python - get 和 dunder getitem 的区别
问题描述
我正在阅读 Fluent Python 并试图更深入地了解字典。
因此,当我运行以下命令时,结果很容易理解,因为 get() 和 dunder getitem() 返回相同的结果
sample = {'a':1, 'b':2}
print(sample.__getitem__('a')) # 1
print(sample.get('a')) # 1
当我用 get() 子类化 dict 时,我得到了一个工作实例
class MyDict(dict):
def __missing__(self, key):
return 0
def get(self, key):
return self[key]
d = MyDict(sample)
print(d['a']) # 1
print(d['c']) # 0
现在,如果我用 dunder getitem() 替换 get() ,我会收到一个错误,我不确定为什么。
class MyDict2(dict):
def __missing__(self, key):
return 0
def __getitem__(self, key):
return self[key]
d = MyDict2(sample)
print(d['a'])
print(d['c'])
错误
RecursionError: maximum recursion depth exceeded while calling a Python object
所以问题是,在这种情况下 get 和 dunder getitem 有什么区别,为什么会导致递归错误?
解决方案
在
def __getitem__(self, key):
return self[key]
self[key]
__getitem__
调用调用self[key]
...无限递归的最低级别。
在:
def get(self, key):
return self[key]
self[key]
也调用最低级别__getitem__
,但从dict
类中调用,因此它不会递归:它有效(您只是重载了get
方法,仅此而已)
推荐阅读
- php - 将逗号分隔的字符串分隔为整数值
- python - 使用python循环调用多个SQL数据库
- node.js - 尝试使用 map() 解决 API 的 Promise
- mongodb - 使用 MongoDB 字段作为另一个值的键引用
- flutter - 为什么我无法在 FLutter 中捕获 Grpc 错误?
- angular - 无法从可观察对象数组中返回过滤后的可观察对象
- aws-lambda - AWS Lambda 连接到 Docker 中的本地 Postgres
- c++ - 打印同一个数组,不同的功能是不同的,为什么?
- html - 带有下载属性的标签在 iphone 中不起作用?
- java - 如何改进对日志文件的数据处理