我是
Python的新手,并且正在考虑通过这篇文章为某些代码使用线程:
Python – Using threads or a queue to iterate over a for loop that calls a function
我想知道为什么这个简单的示例代码错误
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(测试,自我).__ init __(** kwargs)调用有关,但我不确定如何解决它.我的目标是传递相当多的论据,这就是我开始使用** kwargs的原因.
最佳答案 threading.Thread .__ init__期望(最多)group,target,name,args,kwargs和verbose关键字参数.
因为你有大量额外的参数(大概超过了六个线程.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
我不认为这就是你想要发生的事情……