Сохранение состояния сложных скриптовых объектов - PullRequest
3 голосов
/ 09 сентября 2011

В C ++ у меня есть следующие два класса, которые я открываю (используя Boost) для Python:

struct Foo {
    // Empty
};

struct FooContainer {
    // I use boost::shared_ptr for compatibility with Boost.Python
    vector<boost::shared_ptr<Foo>> foos_;
};

На стороне Python я мог бы создать специальный тип Foo, который на самом деле что-то делает вместо того, чтобы быть просто пустым классом, и затем добавить его в FooContainer:

class Useful(Foo):
    def __init__(self, a, b):
        self.a = a
        self.b = b

x = Useful(3, 5);
# Add 'x' to a `FooContainer`

Вернувшись на сторону C ++, в FooContainer теперь есть несколько Foos, но он не знает и не заботится о том, что они из Python. Приложение работает некоторое время, и данные в объектах Foo изменяются ...

Затем я решаю, что хочу сохранить состояние своей программы, чтобы я мог загрузить ее позже. Но проблема в том, что FooContainer мало что знает о своих объектах Foo, он даже не знает, что они пришли из Python, и я не хотел бы загрязнять мой FooContainer данными, которые на самом деле не принадлежат ему (одно- принцип ответственности и все такое).

Есть ли у вас какие-либо советы о том, как мне организовать свое приложение таким образом, чтобы сохранение и загрузка данных, а также загрузка свежих данных (т. Е. Не из состояния, которое я сохранял в прошлом) могут быть выполнены ясным способом?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Вы можете использовать boost :: python / pickle и сохранять данные из python. У меня ограниченный опыт работы с пакетом травления, но он должен работать, если вы переопределяете подходящие методы травления в ваших классах, написанных на python (см. Мой ответ на этот вопрос ).

1 голос
/ 09 сентября 2011

У вас уже есть код на Python, который создает Foos, давайте назовем его populateFoos, и как-то ваша программа вызовет его.

Теперь следующая вещь, которая вам нужна, - это функции storeFoos и loadFoosчто делает сохранение и загрузку.Если вы хотите сохранить его универсальным, определите их как storeFunc и loadFunc (или callback, в зависимости от контекста).

В зависимости от структуры вашей программы вам также может понадобиться сохранить в python списоквсех созданных foos (или связанных с контейнером).

...