猿问

如何更改屈服值

以下代码使用上下文管理器将变量存储和加载到文件中。但是,必须设置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 上发布的,但我决定在此处重新发布以获取答案,并将其留在 CodeReview 上以帮助以其他方式改进代码。


qq_笑_17
浏览 172回答 1
1回答

人到中年有点甜

没有没有办法覆盖python中的赋值运算符,所以你不能这样做&nbsp;loaded = 5(你可以覆盖其他东西,所以它可能有点工作)覆盖__call__以允许loaded(5)覆盖__lshift__以允许loaded << 5覆盖__ior__以允许loaded |= 5(但是要提醒你的同事,否则未来的同事可能永远不会原谅你)此外,在with XXXX as Y:块范围内发生的事情(通常)不能被产生上下文的方法访问,除非该范围以前可以被产生范围的地方访问(即全局命名空间等)
随时随地看视频慕课网APP

相关分类

Python
我要回答