gpt4 book ai didi

python - 薛定谔字典: getting values for dynamic keys on indirect access

转载 作者:太空宇宙 更新时间:2023-11-03 15:06:23 25 4
gpt4 key购买 nike

我想创建一个具有一些动态键的专用字典。子类化 dict 并覆盖 __getitems__ 可以让我完成大部分工作,但是您只能从最后一次直接访问中获取键的值。

$ cat schrodingers_dict.py
cats = []

class SchrodingersDict(dict):
def __getitem__(self, key):
if key == 'dead' or key == 'alive':
self[key] = cats.count(key)
return super().__getitem__(key)

box = SchrodingersDict([('dead', 0), ('alive', 0)])

$ python3 -i schrodinger_dict.py
>>> box
{'dead': 0, 'alive': 0}
>>> cats.append('alive')
>>> cats.append('dead')
>>> cats.append('dead')
>>> box
{'dead': 0, 'alive': 0}
>>> box['dead']
2
>>> box['alive']
1
>>> box
{'dead': 2, 'alive': 1}

是否可以间接访问返回动态值,例如 repr(box)json.dumps(box)

最佳答案

您可能应该扩展MutableMapping并实现相关的抽象方法(委托(delegate)给非计算键的具体底层字典),因为由于性能优化dict不是保证在例如以下情况时调用 __getitem__迭代 k/v。

$ cat schrodingers_dict.py
from collections import MutableMapping
cats = []

class SchrodingersDict(MutableMapping):

def __init__(self, data):
self._store = dict(data)

def __getitem__(self, key):
if key == 'dead' or key == 'alive':
self._store[key] = cats.count(key)
return self._store[key]

def __setitem__(self, key, value):
self._store[key] = value

def __delitem__(self, key):
del self._store[key]

def __iter__(self):
return iter(self._store)

def __len__(self):
return len(self._store)

def __repr__(self):
return repr(dict(self.items()))


box = SchrodingersDict([('dead', 0), ('alive', 0)])
cats.append('dead')
cats.append('dead')
cats.append('alive')

$ python3 -i schrodinger_dict.py
>>> box
{'dead': 2, 'alive': 1}

您可能还希望计算出的键完全虚拟,而不是将它们存储在底层字典中,无论如何,您都会在每次访问时重新计算它们,也可能节省一些指令和空间。

关于python - 薛定谔字典: getting values for dynamic keys on indirect access,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44619857/

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