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

发布于 2021-01-29 15:06:39

我梦见一个带有显式关键字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的主要价值在于其文档价值。只是为了使事情变得有趣。:)

关注者
0
被浏览
99
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    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很美味。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看