2014-05-02 24 views
9

給定一個以多個函數爲參數的高階函數,該函數如何將關鍵字參數傳遞給函數參數?爲不同函數分開** kwargs

例如

def eat(food='eggs', how_much=1): 
    print(food * how_much) 


def parrot_is(state='dead'): 
    print("This parrot is %s." % state) 


def skit(*lines, **kwargs): 
    for line in lines: 
     line(**kwargs) 

skit(eat, parrot_is) # eggs \n This parrot is dead. 
skit(eat, parrot_is, food='spam', how_much=50, state='an ex-parrot') # error 

state不是eat關鍵字ARG所以如何只能通過小品關鍵字ARGS有關,它調用函數?

+4

毫無疑問,有很多方法可以做到這一點,但我認爲你是從錯誤的角度接近這一點。如果兩個函數使用相同名稱的關鍵字arg,並且您希望將不同的值傳遞給這兩個函數,那麼您會做什麼?最好只是明確地傳遞關鍵字參數的字典。有可能每個參數都是(比方說)一個由元素和關鍵字參數組成的雙元組元組。 – Hammerite

+0

這可能是最好的解決方案。 – cheezsteak

回答

8

可以過濾kwargs字典基於函數的func_code.co_varnames

def skit(*lines, **kwargs): 
    for line in lines: 
     line(**{key: value for key, value in kwargs.iteritems() 
       if key in line.func_code.co_varnames}) 

另見:Can you list the keyword arguments a Python function receives?

+2

+1或使用'inspect.getargspec(line).args'。 –

+0

@Aशwiniचhaudhary謝謝,好點,一如既往有幫助。我還添加了一個鏈接到相關的線程。 – alecxe

+0

inspect.getargspec(func).args over line.func_code.co_varnames的好處是什麼?那麼檢查模塊是否只提供了我們在這種情況下不需要的更多選項? – cheezsteak

6

如果添加**kwargs到所有定義的,你可以通過一大堆:

def eat(food='eggs', how_much=1, **kwargs): 
    print(food * how_much) 


def parrot_is(state='dead', **kwargs): 
    print("This parrot is %s." % state) 


def skit(*lines, **kwargs): 
    for line in lines: 
     line(**kwargs) 

**kwargs中的任何內容都不是顯式的關鍵字參數,只會得到l在kwargs中,並且被例如eat

例子:

>>> skit(eat, parrot_is, food='spam', how_much=50, state='an ex-parrot') 
spamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspam 
This parrot is an ex-parrot. 
相關問題