che*_*eak 11 python function kwargs keyword-argument
给定一个更高阶函数,它将多个函数作为参数,该函数如何将关键字参数传递给函数参数?
例
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
Run Code Online (Sandbox Code Playgroud)
state不是关键字arg,eat那么skit如何才能传递与其调用的函数相关的关键字args?
您可以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})
Run Code Online (Sandbox Code Playgroud)
如果添加**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)
Run Code Online (Sandbox Code Playgroud)
任何内容**kwargs都不是一个明确的关键字参数,只会留下来kwargs并被例如忽略eat.
例:
>>> skit(eat, parrot_is, food='spam', how_much=50, state='an ex-parrot')
spamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspamspam
This parrot is an ex-parrot.
Run Code Online (Sandbox Code Playgroud)