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

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

0 голосов
/ 16 января 2019

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

0 голосов
/ 16 января 2019

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...