gpt4 book ai didi

python - 带有对象 ID 的特殊 Python 字典

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

我想创建一个使用对象 ID 作为键的特殊字典,如下所示:

class ObjectIdDict(dict):

def __setitem__(self, key, value):
super(ObjectIdDict, self).__setitem__(id(key), value)

def __getitem__(self, key):
super(ObjectIdDict, self).__getitem__(id(key))

但是如果我运行下面的测试,我会得到一个错误:

class ObjectIdDictTest(unittest.TestCase):
def test_get_and_set(self):
dict_to_test = ObjectIdDict()
class Something:
def __init__(self):
self.x = 1
s = Something()
dict_to_test[s.x] = "message"
self.assertEqual(dict_to_test[s.x], "message")

错误信息:

AssertionError: None != 'message'                   

这里有什么问题?

背景:

创建这样一个奇异的 dict 的原因是我想为对象的每个字段存储验证错误,并希望避免将字段名称作为字符串:domain_object.errors[domain_object.field1] 否则作为字符串的字段名称 (domain_object.errors["field1"]) 不利于重构和代码完成。

ΤZΩΤZΙΟΥ:

I'm certain you don't get anything by using IDs. obj.field1= 1;
print(id(obj.field1)); obj.field1= 2;
print(id(obj.field1))

如果我不使用 ID,键将是变量的,而不是它的地址。如果两个字段具有相同的值,这将导致错误:

def test_ordinary_dict(self):
dict_to_test = {}
class Something:
def __init__(self):
self.x = 1
self.y = 1 # same value as self.x!
s = Something()
dict_to_test[s.x] = "message for x"
dict_to_test[s.y] = "message for y"
self.assertEqual(dict_to_test[s.x], "message for x")

# fails because dict_to_test[s.x] == dict_to_test[1] what results in:
# "message for y"

更改变量值导致新地址并不重要,因为验证结果在此之后不再有效。

最佳答案

__getitem__ 必须返回结果:

def __getitem__(self, key):
return super(ObjectIdDict, self).__getitem__(id(key))
#^^^^^

如果没有 return,隐式返回值为 None,因此所有键的 oiddict[key] 为 None

关于python - 带有对象 ID 的特殊 Python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6160381/

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