Как изменить доходность

1

Следующий код использует менеджер контекста для хранения и загрузки переменных в файлы. Однако очень неприятно иметь свойство value того, что loaded.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, чтобы улучшить код другими способами.

  • 1
    Нет, в Python нет перегрузки присваивания, поэтому вы должны присоединить его к чему-то ... и вещи в этой области недоступны для места, которое привело к загруженному_объекту ... поэтому вы должны присоединить его (вы можете переопределить += или что-то, если вы хотите ... или вы можете сделать что-то вроде __call__ (5), определив метод __call__ вашего класса LoadedValue
  • 0
    @JoranBeasley Если вы хотите добавить это в качестве ответа, я сейчас приму это (если кто-то не придумает способ сделать это)
Теги:
python-3.x
contextmanager
yield

1 ответ

0

нет, в python нет способа переопределить оператор присваивания, поэтому вы не можете делать с loaded = 5

(Вы можете переопределить другие вещи, чтобы это могло работать)

  • переопределить __call__ для разрешения loaded(5)
  • переопределить __lshift__ чтобы разрешить loaded << 5
  • переопределить __ior__ чтобы разрешить loaded |= 5

(однако будьте предупреждены ваши коллеги, или будущие коллеги могут никогда не простить вас)

Кроме того, вещи, которые происходят в области with XXXX as Y: блоком with XXXX as Y: блока with XXXX as Y: (обычно) не доступны для метода, создающего контекст, если только эта область ранее не была доступна для места, предоставляющего область (то есть для глобального пространства имен и т.д.)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню