Объект thread._local не имеет атрибута

Я пытался изменить формат регистрации, добавив контекстный фильтр. Мой формат такой

FORMAT = "%(asctime)s %(VAL)s %(message)s"

Это класс, который я использую для установки VAL в формате.

class TEST:
  def __init__(self, val):
    self.test_var=threading.local()
    self.test_var.value=val
  def filter(self,record):
    record.VAL=self.test_var.value
    return True
  def setValue(self,val)
    self.test_var.value=CMDID

Он отлично работает в однопоточной среде, но для определенной многопоточной среды я получаю ошибку

<Fault 1: "exceptions.AttributeError:'thread._local' object has no attribute 'value'">

Может кто-нибудь сказать мне, что здесь не так?? а как исправить?

1 ответ

Решение

Ну, исключение говорит вам, что thread._local объект вернулся из threading.local() не имеет value атрибут, который вы можете назначить val к. Вы можете подтвердить это, добавив dir(self.test_var) после self.test_var=threading.local() линия. Это возвращает это для меня:

['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__',
 '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__str__']

В самом деле, help(threading.local()) покажет вам методы и атрибуты, которые существуют - value не среди них.

Если вы пытаетесь добавить новый атрибут, то, возможно, вы хотите:

self.test_var.__setattr__('value',val)

Это фактически создаст атрибут и присвоит ему значение.

Атрибуты экземпляра обычно не создаются просто путем их присвоения, как переменные неэкземпляра...

  1. Удалите версию Keras в вашей системе

    pip uninstall keras
    
  2. Установите keras версии 2.2.5

    pip install keras==2.2.5
    

У меня это сработало.

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

Я не могу точно сказать, что вы пытаетесь сделать. Если вы уверены, что хотите локальное хранилище потоков, вы можете использовать hasattr проверить атрибут прямо перед доступом.

Попробуй это:

  def filter(self,record):
    if not hasattr(self.test_var, 'value'):
      self.test_var.value = 'some default var'
    record.VAL=self.test_var.value
    return True

Использовать

from tensorflow.keras import...

вместо того

from keras import...

или наоборот

работает на меня

Другие вопросы по тегам