我有一个定制的字典。每次访问字段时,它将重新加载整个词典。例如,我可能会有这样的循环:
my_dict=myDict('file.yml')
while(True):
print(my_dict['field'])
如果我在运行时修改文件file.conf
,这将更改输出。通过从collections.UserDict
继承并按照this question中所述修改__getitem__
来完成。简而言之,它看起来像这样:
class myDict(collections.UserDict):
def __init__(self, filename):
super().__init__()
self.config_filename=filename
self.reload()
def __getitem__(self, key):
self.reload()
return super().__getitem__(key)
def reload(self):
with open(self.config_filename) as f:
data=yaml.safe_load(f)
super().__init__(data)
我尝试了以下代码:
my_dict=myDict('file.yml')
for e in my_dict['test']:
print(e)
time.sleep(5)
在运行时,我修改了yaml文件,但没有任何效果,这正是我想要的。但是我确实想知道我能相信多少。我在这里的假设是,my_dict['test']
在此for循环中将仅被访问一次,这意味着my_dict.__getitem__
将仅被调用一次。这是正确的吗?
我还尝试过像这样修改循环中的值:
for e in my_dict['test']:
print(e)
print(my_dict['test'][e])
my_dict['test']['me']='hehehehe'
time.sleep(5)
同时,我还修改了文件,但所有更改均未显示在打印输出中。那么这是怎么回事?根据我的实验,似乎for循环等效于:
my_copy = copy.deepcopy(my_dict):
for e in my_copy:
但是认为这是安全的有风险。