gpt4 book ai didi

python - 使用转换键的类似字典的类

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:54 26 4
gpt4 key购买 nike

我想要一个类似 dict 的类,它在查找时透明地使用转换后的键,这样我就可以写

k in d          # instead of f(k) in d
d[k] # instead of d[f(k)]
d.get(k, v) # instead of d.get(f(k), v)

等(例如,假设 f 进行某种规范化,例如 f(k) 返回 k.lower()。)

似乎我可以从 dict 继承并覆盖单个操作,但并不是所有键都经过的这种转换有一个集中点。这意味着我必须覆盖所有的 __contains____getitem__get 和可能的 __missing__ 等。这得到太乏味且容易出错,除非这种开销超过手动替换 f(k) 对普通 dict 的每次调用,否则不是很有吸引力。

最佳答案

好吧,惯用的方法可能是使用 dimo414 的答案。对于转换不纯的情况(在给定相同参数的情况下,不要总是计算相同的结果值):

class Foo(dict):
def __init__(self, transform, *args, **kwargs):
super(Foo, self).__init__(self, *args, **kwargs)
assert isfunction(transform), u'Transform argument must be a function.'
self._transform = transform
def get(self, k, d=None):
return super(Foo, self).get(self._transform(k), d)
def __getitem__(self, item):
return super(Foo, self).__getitem__(self._transform(item))
def __contains__(self, item):
return super(Foo, self).__contains__(self._transform(item))
def __repr__(self):
return '<Foo instance {}>'.format(id(self))

测试:

>>> import datetime
>>> # {0: '0', 1: '1', 2: '2' ... 99: '99'}
>>> x = Foo(lambda x: (datetime.datetime.now() - x).seconds, ((i, str(i)) for i in range(10)))
>>> t = datetime.datetime.now()
>>> x.get(t)
'5'
>>> x[t]
'12'

没那么乏味,但我不喜欢它的味道(就设计而言)。

关于python - 使用转换键的类似字典的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27536672/

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