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