小编典典

将关键字参数实际传递给Python方法

python

我梦见一个带有显式关键字args的Python方法:

def func(a=None, b=None, c=None):
    for arg, val in magic_arg_dict.items():   # Where do I get the magic?
        print '%s: %s' % (arg, val)

我想获得仅包含调用者实际上传递给方法的那些参数的字典,就像**kwargs,但是我不希望调用者能够传递任何旧的随机args,而不是**kwargs

>>> func(b=2)
b: 2
>>> func(a=3, c=5)
a: 3
c: 5

那么:有这样的咒语吗?就我而言,我碰巧能够将每个参数与其默认值进行比较,以找到不同的参数,但这有点不雅致,当您有9个参数时会变得乏味。为了获得奖励积分,即使调用者传入分配了默认值的关键字参数,它也可以告诉我:

>>> func(a=None)
a: None

调皮!

编辑:( 词汇)函数签名必须保持不变。它是公共API的一部分,显式关键字args的主要价值在于其文档价值。只是为了使事情变得有趣。:)


阅读 375

收藏
2021-01-20

共1个答案

小编典典

我从迷失理论的修饰器优点中得到了启发,并在玩了一段时间后想到了这一点:

def actual_kwargs():
    """
    Decorator that provides the wrapped function with an attribute 'actual_kwargs'
    containing just those keyword arguments actually passed in to the function.
    """
    def decorator(function):
        def inner(*args, **kwargs):
            inner.actual_kwargs = kwargs
            return function(*args, **kwargs)
        return inner
    return decorator


if __name__ == "__main__":

    @actual_kwargs()
    def func(msg, a=None, b=False, c='', d=0):
        print msg
        for arg, val in sorted(func.actual_kwargs.iteritems()):
            print '  %s: %s' % (arg, val)

    func("I'm only passing a", a='a')
    func("Here's b and c", b=True, c='c')
    func("All defaults", a=None, b=False, c='', d=0)
    func("Nothin'")
    try:
        func("Invalid kwarg", e="bogon")
    except TypeError, err:
        print 'Invalid kwarg\n  %s' % err

哪个打印此:

我只路过
  答:
这是b和c
  b:正确
  c:
所有默认值
  答:无
  b:错误
  C: 
  d:0
没什么
无效的kwarg
  func()得到了意外的关键字参数'e'

我对此很满意。一种更灵活的方法是将要使用的属性的名称传递给装饰器,而不是将其硬编码为“ actual_kwargs”,但这是说明解决方案的最简单方法。

嗯,Python很美味。

2021-01-20