Работа над проектом, который требует, чтобы я смог засолить контейнерный объект в любой точке, так как мы ожидаем, что это перестанет работать на внешних условиях вполне часто и сможет полностью взять, где мы кончили.
Я пользуюсь библиотекой входа Python вполне экстенсивно, и все мои классы запускаются путем установки регистратора как:
class foo:
def __init__(self):
self.logger = logging.getLogger("package.foo")
Так как я солю контейнерный класс, он имеет несколько слоев классов в нем, каждого с их собственным экземпляром регистратора.
Теперь, по некоторым причинам, эти регистраторы повреждают Рассол. Я получаю следующую ошибку, которая уходит, если я удаляю self.logger из всех классов:
Can't pickle 'lock' object: <thread.lock object at ... >
Таким образом, мой вопрос состоит в том, существует ли некоторый способ удалить объекты блокирования из всех регистраторов, не имея необходимость рекурсивно вызывать через мои целые регистраторы удаления дерева объектов, которые я должен буду воссоздать на нерассоле.
Здесь обнаружен очень похожий вопрос с ответом, который сработал для меня:
Как запретить атрибутам быть маринованный в Python
edit: использовал этот ответ: Как запретить маринование атрибутов в Python
Вы можете создать класс, который обертывает регистратор и реализует __ getstate __
и
__ setstate __
.
Это вставлено из http://docs.python.org/library/pickle.html . fh
обрабатывается способом, который может быть похож на то, что вам нужно.
#!/usr/local/bin/python
class TextReader:
"""Print and number lines in a text file."""
def __init__(self, file):
self.file = file
self.fh = open(file)
self.lineno = 0
def readline(self):
self.lineno = self.lineno + 1
line = self.fh.readline()
if not line:
return None
if line.endswith("\n"):
line = line[:-1]
return "%d: %s" % (self.lineno, line)
def __getstate__(self):
odict = self.__dict__.copy() # copy the dict since we change it
del odict['fh'] # remove filehandle entry
return odict
def __setstate__(self, dict):
fh = open(dict['file']) # reopen file
count = dict['lineno'] # read from file...
while count: # until line count is restored
fh.readline()
count = count - 1
self.__dict__.update(dict) # update attributes
self.fh = fh # save the file object