开发者社区> 问答> 正文

如何改变 yielded value值

python小能手 2019-01-18 10:55:28 342

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

不必定义像这样的新类 LoadedValue
将context manager(loaded)的yielding值设置为保存的值。
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上,但我决定在此处重新发布它以获得答案,并将其保留在CodeReview上以帮助以其他方式改进代码。

存储
分享到
取消 提交回答
全部回答(1)
  • python小能手
    2019-07-17 23:25:51

    没有办法在python中覆盖赋值运算符,所以你不能这样做 loaded = 5

    (你可以覆盖其他东西,所以它可能有点用)

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

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

    0 0
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

推荐文章
相似问题