2013-07-11 28 views
2

我有下面的代碼,這將導致該錯誤:問題傳遞參數到Python功能與​​裝飾

TypeError('smallTask() takes exactly 1 argument (2 given)',) 

@task 
def master(): 
    count = 0 
    obj = { 'var1':'val1', 'var2':'val2' } 

    while count < 10: 
     subtask('smallTask',obj).apply_async() 
     count += 1 

@task(name='smallTask') 
def smallTask(obj): 
    print obj 

傳遞一個字典的功能,我想我需要使用* * kwargs,但如果我這樣做,我得到的錯誤,該函數沒有任何參數,但已提供2。

我認爲這裏的問題是無論是裝飾者(有一個基本的理解,但不足以解決問題)或在芹菜subtask函數。

我沒有足夠的Python知識來真正進行......任何人都可以給我一個關於發生了什麼的想法,以及如何將smallTask​​函數傳遞給字典?

回答

5

您需要根據celery.subtask() documentation來傳遞參數在args關鍵字參數一個子任務,它必須是一個元組:

subtask('smallTask', args=(obj,)).apply_async() 

或使用Task.subtask()方法smallTask的任務,但再次通過參數爲一個元組:

smallTask.subtask((obj,)).apply_async() 

另外,使用星參數與Task.s() method

smallTask.s(obj).apply_async() 

subtasks documentation您自己鏈接到在示例中使用元組;參數和關鍵字參數是Celery必須存儲的兩條數據,直到它可以運行該任務,然後然後它會爲您應用這些參數和關鍵字參數。

celery.subtask()函數不僅僅爲您的任務使用參數和關鍵字參數;它也需要額外的選擇。爲了與任務任意參數(位置或關鍵字)一起工作,支持其他參數而不是傳遞給您的任務,函數簽名別無選擇,只能接受位置參數作爲顯式元組,和關鍵字參數作爲明確的字典。

Task.s()方法不接受除了任務本身可以接受的任何參數,所以它支持傳遞參數,就像直接調用任務一樣。在內部,它使用全部參數:Task.s(*args, **kwarg),只是將捕獲的參數作爲元組和字典傳遞到Task.subtask()

+0

好吧,這絕對有效,並樂意接受,但在這一點上,它可能是巫術。請介意再詳細一點嗎?我可以研究關鍵字參數,但爲什麼obj是一個元組?謝謝, – rix

+0

@rix:展開。這真是一個閱讀文檔的問題。 –

+0

謝謝,這有很大的幫助。更多的情況是,我並不瞭解足夠的python以使文檔變得有用。需要閱讀位置和關鍵字參數。真的很感謝你花時間回答。謝謝! – rix