簡體   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