以下代码使用上下文管理器将变量存储并加载到文件中。但是,必须设置valuecontext manager(loaded.value)所产生的属性非常烦人。我想要
不必定义像这样的新类 LoadedValue
将context manager(loaded)的yielding值设置为保存的值。
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上,但我决定在此处重新发布它以获得答案,并将其保留在CodeReview上以帮助以其他方式改进代码。
没有办法在python中覆盖赋值运算符,所以你不能这样做 loaded = 5
(你可以覆盖其他东西,所以它可能有点用)
覆盖__call__以允许loaded(5)
覆盖__lshift__以允许loaded << 5
覆盖__ior__以允许loaded |= 5
此外,在with XXXX as Y:块的范围内发生的事情(通常)不会产生上下文的方法,除非该范围以前可以被产生范围的地方访问(即全局命名空间等)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。