python - 为不同的函数分离 **kwargs

标签 python function 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

state 不是 eat 的关键字参数,那么 skit 怎么能只传递与其调用的函数相关的关键字参数呢?

最佳答案

您可以根据函数的 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})

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

关于python - 为不同的函数分离 **kwargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23430248/

相关文章:

Python os.listDir 在某些文件夹上抛出 "WindowsError: [Error 5] Access is denied:"

python - 在 Python 中,什么决定了遍历 kwargs 时的顺序?

python - 解压字典以作为关键字参数传递时,如何将键映射到不同名称的关键字参数?

python - UnicodeEncodeError - Python/Django 和 Postgres

python - 为 python 3 urllib 打开调试输出

python - 如何实现定时后台功能?

python - 函数未正确写入 .xls。 Python 2.7.1

javascript - 如何编写一个名为 countDots(x) 的函数,该函数将字符串作为参数并返回它包含的点数 (.)

function - 如何在 Haskell 中从 a -> IO b 生成 IO (a->b) 函数

python - 如何使用 list *args 为字典创建函数?