【问题标题】:Threading and passing values with **kwargs errors to TypeError将带有 **kwargs 错误的值线程化并传递给 TypeError
【发布时间】:2023-03-05 11:59:01
【问题描述】:

我对 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 开头的原因。

【问题讨论】:

    标签: python multithreading class dictionary keyword-argument


    【解决方案1】:

    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
    

    我不认为这是你想要发生的事情......

    【讨论】:

    • 好吧,假设我想使用 **kwargs 来接受输入,那该怎么做?
    • 好的,这很有帮助!如果传递了非常多的属性,是否仍然使用self.__dict__.update(**kwargs)) 来保持优雅?
    • 您先生是个天才。非常感谢。
    【解决方案2】:

    您将参数 A 和 B 传递给不需要它们的 Thread 构造函数。可能你应该只调用不带参数的超级构造函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 2010-12-31
      • 1970-01-01
      相关资源
      最近更新 更多