我梦见一个带有显式关键字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。
**kwargs
>>> func(b=2) b: 2 >>> func(a=3, c=5) a: 3 c: 5
那么:有这样的咒语吗?就我而言,我碰巧能够将每个参数与其默认值进行比较,以找到不同的参数,但这有点不雅致,当您有9个参数时会变得乏味。为了获得奖励积分,即使调用者传入分配了默认值的关键字参数,它也可以告诉我:
>>> func(a=None) a: None
调皮!
编辑:( 词汇)函数签名必须保持不变。它是公共API的一部分,显式关键字args的主要价值在于其文档价值。只是为了使事情变得有趣。:)
我从迷失理论的修饰器优点中得到了启发,并在玩了一段时间后想到了这一点:
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很美味。