为不同的功能分离**kwargs

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?

ale*_*cxe 9

您可以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)

另请参阅:您是否可以列出Python函数接收的关键字参数?

  • +1或使用`inspect.getargspec(line).args`. (2认同)
  • @ptwales `inspect` 真的 [使用](https://github.com/python/cpython/blob/2.7/Lib/inspect.py#L804) 引擎盖下相同的 `func_code`。`inspect` 一般说来是一种工作工具,它为对象检查中涉及的“魔法”提供了一个接口。 (2认同)

jon*_*rpe 7

如果添加**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)