2013-02-25 58 views
3

我是很新,Python和正在研究通過這篇文章使用線程的一些代碼: Python - Using threads or a queue to iterate over a for loop that calls a function線程和傳遞價值觀與** kwargs錯誤類型錯誤

我想知道爲什麼這個簡單的例子代碼中的錯誤出到

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

回答

0

threading.Thread.__init__預計(至多)grouptargetnameargskwargsverbose關鍵字參數。

既然你有大量的額外的參數(大概比六是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 

我不認爲這是要發生什麼......

+0

好吧,假設我想使用** kwargs來接受輸入,那麼將如何完成? – Jetbo 2013-02-25 13:08:28

+0

好吧,這會有很大的幫助!如果有大量屬性傳遞,仍然使用'self .__ dict __。update(** kwargs))'來保持優雅? – Jetbo 2013-02-25 13:16:55

+0

你先生是個天才。非常感謝你。 – Jetbo 2013-02-25 13:21:13

2

您將參數A和B傳遞給線程構造函數,它不需要它們。可能你應該只是調用沒有參數的超級構造函數。

+0

可愛啊,謝謝你那。我真的很感激! – Jetbo 2013-02-25 13:01:01