开发者社区> 问答> 正文

如何改变 yielded value值

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

展开
收起
一码平川MACHEL 2019-01-18 10:55:28 1609 0
1 条回答
写回答
取消 提交回答
  • 没有办法在python中覆盖赋值运算符,所以你不能这样做 loaded = 5

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

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

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

    2019-07-17 23:25:51
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
用计算和数据去改变整个世界 立即下载
重新定义计算的边界 立即下载
低代码开发师(初级)实战教程 立即下载