代码之家  ›  专栏  ›  技术社区  ›  Pro Q Rich Lysakowski PhD

如何改变产出值

  •  1
  • Pro Q Rich Lysakowski PhD  · 技术社区  · 6 年前

    以下代码使用上下文管理器将变量存储和加载到文件中。 但是,设置 value 上下文管理器生成的内容的属性( loaded.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>
    

    注:这是 originally posted 关于代码审查,但是我决定把它放在这里,以便得到答案,并把它留在代码审查中,以帮助以其他方式改进代码。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Joran Beasley    6 年前

    不,没有办法重写python中的赋值运算符,因此您不能这样做。 loaded = 5

    (你可以覆盖其他东西,这样它就可以工作了)

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

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

    此外,在 with XXXX as Y: 块不能(通常)被生成上下文的方法访问,除非生成该范围的位置(即全局命名空间等)以前可以访问该范围。