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

时间:2013-12-27 05:35:06

标签: python python-2.7

我知道这个问题听起来很愚蠢,但我无法做对。

我想开始一个新线程来执行带有多个参数的函数。我不知道如何完成它。这里总是有错误。

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

新线程将启动此功能。

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

任何人都可以帮助我吗?怎么做对吗?感谢

2 个答案:

答案 0 :(得分:4)

元组不接受关键字参数,它们不是函数。如果要传递关键字参数,请将字典作为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)
)

答案 1 :(得分:1)

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

但对此类线程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

如果您不喜欢这个答案,请在评论中告诉我,我会将其删除。

感谢