下面的代码使用上下文管理器将变量存储并加载到文件中。
但是,必须设置上下文管理器(loaded.value
)产生的内容的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上,以在其他方面帮助改进代码。你知道吗
不,在python中没有方法重写赋值运算符,因此不能执行
loaded = 5
(您可以覆盖其他内容,这样它可能会起作用)
__call__
以允许loaded(5)
__lshift__
以允许loaded << 5
__ior__
以允许loaded |= 5
(但是,请警告你的同事,否则未来的同事可能永远不会原谅你)
此外,在
with XXXX as Y:
块的作用域内发生的事情(通常)不可由产生上下文的方法访问,除非该作用域以前可由产生该作用域的地方访问(即全局命名空间等)相关问题 更多 >
编程相关推荐