繁体   English   中英

为不同的功能分离 **kwargs

[英]Separating **kwargs for different functions

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

例子

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,所以skit 如何只传递与其调用的函数相关的关键字args?

您可以根据func_code.co_varnames (在 python 2 中)过滤kwargs字典:

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})

在Python 3, __code__应该用来代替func_code 所以函数将是:

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

另请参阅: 您能否列出函数接收的关键字参数?

如果将**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.

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM