Как сохранить объекты в Python без использования pickle? - PullRequest
0 голосов
/ 10 ноября 2019

Я хочу сохранить объект в файле, чтобы я мог использовать его позже (после закрытия программы).

Я пытался использовать pickle, но, похоже, он не похож на мой объект: D

Traceback (most recent call last):
  File "(path)", line 4, in <module>
    pickle.dump(object, f)
AttributeError: Can't pickle local object '_createenviron.<locals>.encodekey'

вот код:

import pickle
object = MyWeirdClass()
with open("data.pickle", "wb") as f:
    pickle.dump(object, f)

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

РЕДАКТИРОВАТЬ:

я обнаружил, что проблема в том, что одна из переменных объекта - это объект selenium.webdriver.chrome.webdriver.WebDriver . после удаления этого объекта (после выполнения того, что я хотел с ним) он работал нормально.

ВТОРОЕ РЕДАКТИРОВАНИЕ:

я также получил эту ошибку:

RecursionError: maximum recursion depth exceeded while pickling an object

В строке кода я попытался записать объект в файл.

Я обнаружил, что должен установить sys.setrecursionlimit () на более высокое значение, поэтому вместо этогоустановить его в случайные значения, пока я не получу никаких ошибок, я делаю это:

import pickle
import sys
default_cursion_limit = sys.getrecursionlimit()# defalut is 1000
object = MyWeirdClass()
while True:
    try:
        with open("data.pickle", "wb") as f:
            pickle.dump(object, f)
        break
    except RecursionError:
        default_cursion_limit += 50
        sys.setrecursionlimit(default_cursion_limit)# looks like its working with 2600

1 Ответ

3 голосов
/ 10 ноября 2019

Самым простым решением будет определить ваш класс таким образом, чтобы он был легко замачиваться. Сообщение об ошибке указывает на то, что некоторые атрибуты вашего класса не могут быть выбраны, потому что у них нет глобально именованных областей.

Если вы хотите сохранить объект, который не может быть выбран, вам нужно написать свойсобственная логика для сериализации и десериализации. Невозможно дать конкретный совет по этому поводу, не видя объекта, но общая идея заключается в том, что вам нужно выяснить, как представить состояние вашего объекта как нечто, что вы МОЖЕТЕ выбрать (например, ряд простых атрибутов string / int), а затем написатьфункция, которая восстановит ваш объект по этим данным.

...