4

私は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(Test, self).__init__( **kwargs)呼び出しに関係しているということですが、それを回避する方法がわかりません。私の目標は、かなり大量の引数を渡すことです。そのため、最初から使用**kwargsしています。

4

2 に答える 2

2

引数 A と B を Thread コンストラクターに渡していますが、これはそれらを必要としません。おそらく、引数なしでスーパー コンストラクターを呼び出す必要があります。

于 2013-02-25T12:58:18.857 に答える
0

threading.Thread.__init__group(最大) 、targetname、およびキーワード引数argsを期待します。kwargsverbose

余分な引数が多数あるため (おそらくthreading.Thread.__init__期待される 6 つよりも多い)、それらの 6 つを明示的に抽出して残りを

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

それはあなたが望んでいることではないと思います...

于 2013-02-25T12:58:23.397 に答える