Threading и передача значений с ошибками ** kwargs в TypeError

Я довольно новичок в Python и изучал использование потоков для некоторого кода через этот пост: Python – использование потоков или очереди для итерации по циклу for, который вызывает функцию

Мне было интересно, почему этот простой пример ошибок кода

Error: line 1: TypeError: file <maya console> line 4: __init__() got an unexpected keyword argument 'A' # 

Мой код:

 import threading class Test(threading.Thread): def __init__(self, **kwargs): super(Test, self).__init__( **kwargs) self.__dict__.update(**kwargs) A = None B = 1 test = Test(A = A, B = B) print test.A print test.B 

Я полагаю, что это связано с вызовом super(Test, self).__init__( **kwargs) , но я не уверен, как его обойти. Моя цель – передать довольно много аргументов, поэтому я использую **kwargs для начала.

threading.Thread.__init__ ожидает (не более) group , target , name , args , kwargs и verbose аргументов ключевого слова.

Поскольку у вас есть большое количество дополнительных аргументов (предположительно, больше шести, чем threading.Thread.__init__ ожидает), тогда может быть меньше работы по threading.Thread.__init__ , извлечение этих шести и управление остальными с помощью

 self.__dict__.update(**kwargs) 

 import threading class Test(threading.Thread): def __init__(self, **kwargs): super(Test, self).__init__( **{k: v for k in 'group target name args kwargs verbose'.split() if k in kwargs}) self.__dict__.update(**kwargs) A = None B = 1 test = Test(A=A, B=B) print test.A print test.B 

Обратите внимание, если вы вызываете __init__ без аргументов:

 super(Test, self).__init__() 

затем целая куча атрибутов, используемых для threading.Thread не будет установлен:

 class Thread(_Verbose): def __init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None): assert group is None, "group argument must be None for now" _Verbose.__init__(self, verbose) if kwargs is None: kwargs = {} self.__target = target self.__name = str(name or _newname()) self.__args = args self.__kwargs = kwargs self.__daemonic = self._set_daemon() self.__ident = None self.__started = Event() self.__stopped = False self.__block = Condition(Lock()) self.__initialized = True # sys.stderr is not stored in the class like # sys.exc_info since it can be changed between instances self.__stderr = _sys.stderr 

Я не думаю, что это то, что вы хотите …

Вы передаете аргументы A и B конструктору Thread, который им не нужен. Вероятно, вы должны просто вызвать супер конструктор без аргументов.