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

97
13

Я новичок в 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 для начала.

спросил(а) 2021-01-19T16:42:20+03:00 2 месяца, 4 недели назад
1
Решение
75

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

ответил(а) 2021-01-19T16:42:20+03:00 2 месяца, 4 недели назад
44

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


Поскольку у вас есть большое количество дополнительных аргументов (предположительно больше шести, которые ожидает 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

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

ответил(а) 2021-01-19T16:42:20+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема