以下代码使用上下文管理器将变量存储并加载到文件中。
但是,必须设置上下文管理器(value
)产生的属性的loaded.value
属性非常令人讨厌。
我想
LoadedValue
这样的新类loaded
)的屈服值设置为保存的值。解决其中任何一个问题将不胜感激。
import os
import pickle
from contextlib import contextmanager
class LoadedValue:
def __init__(self, value):
self.value = value
def __str__(self):
return "<LoadedValue: {}>".format(self.value)
@contextmanager
def load_manager(load_file="file.pkl"):
with open(load_file, "rb") as f:
loaded_object = LoadedValue(pickle.load(f))
try:
yield loaded_object
finally:
with open(load_file, "wb+") as f:
pickle.dump(loaded_object.value, f)
if __name__ == "__main__":
filename = "test.pkl"
with open(filename, "wb+") as f:
pickle.dump(7, f)
with load_manager(filename) as loaded:
print(loaded) # >>> <LoadedValue: 7>
loaded.value = 5 # this is what I have to do
# loaded = 5 # this is what I want to do
with load_manager(filename) as loaded:
print(loaded) # >>> <LoadedValue: 5>
注意:这是CodeReview上的originally posted,但为了获得答案,我决定将其重新张贴在此处,然后将其保留在CodeReview上,以通过其他方式帮助改进代码。
答案 0 :(得分:1)
没有办法在python中覆盖赋值运算符,因此您无法执行loaded = 5
(您可以覆盖其他内容,以便进行某些工作)
__call__
以允许loaded(5)
__lshift__
以允许loaded << 5
__ior__
以允许loaded |= 5
(但是要警告您的同事,否则未来的同事可能永远不会原谅您)
而且,with XXXX as Y:
块范围内发生的事情(通常)不能由产生上下文的方法访问,除非该范围以前是产生范围的地方(即全局对象)可访问的命名空间等)