以下代碼使用上下文管理器將變量存儲和加載到文件中。但是,必須設(shè)置value上下文管理器 ( loaded.value)所產(chǎn)生內(nèi)容的屬性非常煩人。我想要不必像這樣定義一個新類 LoadedValue將上下文管理器 ( loaded) 的生成值設(shè)置為保存的值。解決這些問題中的任何一個將不勝感激。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 上發(fā)布的,但我決定在此處重新發(fā)布以獲取答案,并將其留在 CodeReview 上以幫助以其他方式改進代碼。
1 回答

人到中年有點甜
TA貢獻1895條經(jīng)驗 獲得超7個贊
沒有沒有辦法覆蓋python中的賦值運算符,所以你不能這樣做 loaded = 5
(你可以覆蓋其他東西,所以它可能有點工作)
覆蓋
__call__
以允許loaded(5)
覆蓋
__lshift__
以允許loaded << 5
覆蓋
__ior__
以允許loaded |= 5
(但是要提醒你的同事,否則未來的同事可能永遠不會原諒你)
此外,在with XXXX as Y:
塊范圍內(nèi)發(fā)生的事情(通常)不能被產(chǎn)生上下文的方法訪問,除非該范圍以前可以被產(chǎn)生范圍的地方訪問(即全局命名空間等)
添加回答
舉報
0/150
提交
取消