python - 当我更改嵌套字典中的值时会调用什么方法?
问题描述
我试图通过包装类型dict
并特别重载__setitem__
将值写入文件来创建一个持久字典。
class PersistentStorage(dict):
def __init__(self, file_name, *args, **kwargs):
super().__init__(*args, **kwargs)
self.path = file_name
def write_dict(self):
with open(self.path, "w") as f:
json.dump(self, f)
def __setitem__(self, key, value):
super().__setitem__(key,value)
self.write_dict() # writes 'self' to a json file.
只要我不使用嵌套字典,这将按预期工作:
tester = PersistenStorage("example_path.json")
tester["key1"] = "Value for key 1"
# works and gets saved
tester["key2"] = {"subkey":""}
# works as well
tester["key2"]["subkey"] = "Added value"
# works locally but is not written to file (__setitem__ is not called)
我也尝试重载该类的其他方法,但似乎找不到在这种情况下被调用的方法。我也不明白为什么__setitem__
不叫。
我也研究过typing
,collections
但在我看来,直接dict
用作模板类是最好的选择,因为我不想改变类型的固有功能,而只是扩展读写。
解决方案
调用此代码:
tester["key2"]["subkey"] = "Added value"
相当于以下两行:
key2_value = tester["key2"]
key2_value["subkey"] = "Added value"
在第一行,PersistentStorage.__getitem__
被称为(因为tester
是 a PersistentStorage
)
在第二行中,dict.__setitem__
被称为(因为key2_value
是 a dict
)。
如果要覆盖该设置器,则不应使用“正常”dict
作为tester["key2"]
.
例如,您可以更改此行:
tester["key2"] = {"subkey":""}
对此:
tester["key2"] = MyDictWithOverridden_setitem({"subkey":""})
然后实施MyDictWithOverridden_setitem
,或任何你称之为的东西,例如
class MyDictWithOverridden_setitem(dict):
def __setitem__(self, key, value):
do_something_special()
推荐阅读
- r - 使用 POSIXct 和 POSIXt 进行模糊连接
- react-native - 我应该将 useMemo 与 React Native Webview 一起使用吗?
- regex - 正则表达式:如何检查字符串是否为空或空白且不包含字符“<”和“>”?
- javascript - 按嵌套对象属性对对象数组进行排序
- ios - 有什么方法可以在运行时更改 ios 上推送通知的权限?
- python - Python列表理解,查找表
- python - 比较 2 个大小不均匀的 Pandas DataFrames 的匹配值并组合在一起,然后用最接近的数据替换 NaN 值
- python - 将带有列表的 Pandas 列转换为字符串
- r - 根据成员资格从 igraph 对象绘制“迷你”图
- android - 房间数据库元素未显示