为不同的功能分隔**

问题描述 投票:12回答:3

给出一个以多个函数为参数的高阶函数,该函数如何将关键字参数传递给函数参数?

示例

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?

python function kwargs keyword-argument
3个回答
10
投票

您可以基于函数的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?


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)

**kwargs中的任何内容也不是明确的关键字参数,只会留在kwargs中,并被例如eat

示例:

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

-1
投票

def sample(a,b,*,c=0): print(a,b,c)

*->在参数为args之前和参数为kwargs(关键字参数)之后

sample(1,2,c=10) sample(a=1,b=2,c=1) # this also work sample(1,2,c) # TypeError: sample() takes 2 positional arguments but 3 were given

© www.soinside.com 2019 - 2024. All rights reserved.