如何更改收益值

时间:2019-01-16 04:23:22

标签: python python-3.x yield contextmanager

以下代码使用上下文管理器将变量存储并加载到文件中。 但是,必须设置上下文管理器(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>

注意:这是CodeReview上的originally posted,但为了获得答案,我决定将其重新张贴在此处,然后将其保留在CodeReview上,以通过其他方式帮助改进代码。

1 个答案:

答案 0 :(得分:1)

没有办法在python中覆盖赋值运算符,因此您无法执行loaded = 5

(您可以覆盖其他内容,以便进行某些工作)

  • 覆盖__call__以允许loaded(5)
  • 覆盖__lshift__以允许loaded << 5
  • 覆盖__ior__以允许loaded |= 5

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

而且,with XXXX as Y:块范围内发生的事情(通常)不能由产生上下文的方法访问,除非该范围以前是产生范围的地方(即全局对象)可访问的命名空间等)