以下代码使用上下文管理器将变量存储和加载到文件中。但是,必须设置value上下文管理器 ( loaded.value)所产生内容的属性非常烦人。我想要不必像这样定义一个新类 LoadedValue将上下文管理器 ( loaded) 的生成值设置为保存的值。解决这些问题中的任何一个将不胜感激。import osimport picklefrom contextlib import contextmanagerclass LoadedValue: def __init__(self, value): self.value = value def __str__(self): return "<LoadedValue: {}>".format(self.value)@contextmanagerdef 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 上以帮助以其他方式改进代码。
1 回答

人到中年有点甜
TA贡献1895条经验 获得超7个赞
没有没有办法覆盖python中的赋值运算符,所以你不能这样做 loaded = 5
(你可以覆盖其他东西,所以它可能有点工作)
覆盖
__call__
以允许loaded(5)
覆盖
__lshift__
以允许loaded << 5
覆盖
__ior__
以允许loaded |= 5
(但是要提醒你的同事,否则未来的同事可能永远不会原谅你)
此外,在with XXXX as Y:
块范围内发生的事情(通常)不能被产生上下文的方法访问,除非该范围以前可以被产生范围的地方访问(即全局命名空间等)
添加回答
举报
0/150
提交
取消