gpt4 book ai didi

python - 如果模拟 dict,则在 python 中为 __getitem__() 对象子类化的正确方法

转载 作者:太空宇宙 更新时间:2023-11-04 10:28:11 25 4
gpt4 key购买 nike

子类化 object.__getitem__() 的正确方法是什么,但退回到默认行为?我想让它看起来像一个对任何可能的键都动态(但始终如一)表现的字典。

class MyObj(object):
"""MyObj()[k] returns 1 for any key k that ends in '_q',
default item lookup behavior otherwise"""
mypattern = re.compile(r'_q$')
def __getitem__(self, k):
if self.mypattern.match(k):
return 1
else:
???

我尝试调用 return super(TFConverter, self).__getitem__(k) 它告诉我 AttributeError: 'super' object has no attribute '__getitem__'

最佳答案

如果你想模拟一个类似dict的界面,你应该在项目不存在时引发一个KeyError,就像dict 确实如此。当您的键是字符串时,往往会出现这种情况。

def __getitem__(self, k):
if self.mypattern.match(k):
return 1
else:
raise KeyError("Key {} does not match pattern {}".format(k, self.mypattern))

如果您希望您的对象像 list 一样工作(通常情况下它有整数键),您应该引发一个 IndexError

调用 super().__getitem__ 不起作用,因为 object 没有定义 __getitem____getitem__ 只存在于支持下标的对象上。所以如果你想委托(delegate)给父类(super class)的 __getitem__ 实现,你必须确保你正在子类化定义它的东西(比如 dict)。

另一种用例是在找不到 key 时返回默认值。例如,这里有一个纯Python改写的collections.defaultdict(真正的版本是用C写的):

class defaultdict(dict):
# default_factory is a function which supplies the default value when a key is not found
def __init__(self, default_factory):
self.default_factory = default_factory

def __getitem__(self, key):
if key in self:
# the super() call works here because we are
# subclassing dict, which supports __getitem__
return super().__getitem__(key)
if self.default_factory is not None:
val = self.default_factory(key)
self[key] = val
return val
raise KeyError(key)

关于python - 如果模拟 dict,则在 python 中为 __getitem__() 对象子类化的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28242721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com