如何更改生成值

2024-03-29 13:59:22 发布

您现在位置:Python中文网/ 问答频道 /正文

下面的代码使用上下文管理器将变量存储并加载到文件中。 但是,必须设置上下文管理器(loaded.value)产生的内容的value属性是非常烦人的。 我想

  1. 不必定义像LoadedValue这样的新类
  2. 将上下文管理器(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上,以在其他方面帮助改进代码。你知道吗


Tags: importself管理器valuedefaswithmanager
1条回答
网友
1楼 · 发布于 2024-03-29 13:59:22

不,在python中没有方法重写赋值运算符,因此不能执行loaded = 5

(您可以覆盖其他内容,这样它可能会起作用)

  • 重写__call__以允许loaded(5)
  • 重写__lshift__以允许loaded << 5
  • 重写__ior__以允许loaded |= 5

(但是,请警告你的同事,否则未来的同事可能永远不会原谅你)

此外,在with XXXX as Y:块的作用域内发生的事情(通常)不可由产生上下文的方法访问,除非该作用域以前可由产生该作用域的地方访问(即全局命名空间等)

相关问题 更多 >