Как засолить регистраторы?

Работа над проектом, который требует, чтобы я смог засолить контейнерный объект в любой точке, так как мы ожидаем, что это перестанет работать на внешних условиях вполне часто и сможет полностью взять, где мы кончили.

Я пользуюсь библиотекой входа Python вполне экстенсивно, и все мои классы запускаются путем установки регистратора как:

class foo:
   def __init__(self):
       self.logger = logging.getLogger("package.foo")

Так как я солю контейнерный класс, он имеет несколько слоев классов в нем, каждого с их собственным экземпляром регистратора.

Теперь, по некоторым причинам, эти регистраторы повреждают Рассол. Я получаю следующую ошибку, которая уходит, если я удаляю self.logger из всех классов:

Can't pickle 'lock' object: <thread.lock object at ... >

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

7
задан abccd 2 July 2018 в 18:47
поделиться

2 ответа

Здесь обнаружен очень похожий вопрос с ответом, который сработал для меня:

Как запретить атрибутам быть маринованный в Python

edit: использовал этот ответ: Как запретить маринование атрибутов в Python

2
ответ дан 6 December 2019 в 09:17
поделиться

Вы можете создать класс, который обертывает регистратор и реализует __ 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
4
ответ дан 6 December 2019 в 09:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: