Объект 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)
Это фактически создаст атрибут и присвоит ему значение.
Атрибуты экземпляра обычно не создаются просто путем их присвоения, как переменные неэкземпляра...
Удалите версию Keras в вашей системе
pip uninstall keras
Установите 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...
или наоборот
работает на меня