我从迷失理论的修饰器优点中得到了启发,并在玩了一段时间后想到了这一点:
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 decoratorif __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 kwargn %s' % err
哪个打印此:
我只路过 答:这是b和c b:正确 c:所有默认值 答:无 b:错误 C: d:0没什么无效的kwarg func()得到了意外的关键字参数'e'
我对此很满意。一种更灵活的方法是将要使用的属性的名称传递给装饰器,而不是将其硬编码为“ actual_kwargs”,但这是说明解决方案的最简单方法。
嗯,Python很美味。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)