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