[英]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.