繁体   English   中英

python将元组作为函数参数传递

[英]python passing tuple as function parameter

我知道这个问题听起来很愚蠢,但我无法正确解决。

我想启动一个新线程以执行带有多个参数的此功能。 我不知道该怎么做。 这里总是有错误。

thread = threading.Thread(target=urllib2.urlopen, args=((url=REMOTE_SERVER_URL, data=context),))
thread.start()

新线程将启动此功能。

urllib2.urlopen(url=REMOTE_SERVER_URL, data=context)

谁能帮我? 如何正确处理? 谢谢

元组不接受关键字参数,它们不是函数。 如果要传递关键字参数,则将字典作为kwargs参数传递:

thread = threading.Thread(target=urllib2.urlopen, kwargs={
    'url': REMOVE_SERVER_URL,
    'data': context
})

要么:

thread = threading.Thread(
    target=urllib2.urlopen,
    kwargs=dict(url=REMOVE_SERVER_URL, data=context)
)

@Blender已经在上面给出了解决方案。

但是对此类Thread constructor的解释很少。

在线程模块中,Class Thread不使用任何* args和** kwargs,

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

在上面的代码段中,args只是一个参数,其默认值为空元组,而kwargs是另一个参数,其默认值为空字典。 这与def foo(*args, **kwargs)类的函数不同,因此,如果要传递元组参数,请使用args ;如果要传递字典参数,请使用kwargs。

因此,如果您创建一个如下所示的对象,将运行而不会出现任何错误,但这是错误的。

>>> thread = threading.Thread(target=urllib2.urlopen, args='some argument which is not tuple', kwargs='some argument which is not dict')
>>> 

从源代码:请检查args和kwargs行,那里没有解包。

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

如果您不喜欢这个答案,请在评论中让我知道,我将其删除。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM