当前位置: 首页 > 面试题库 >

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

靳举
2023-03-14
问题内容

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


问题答案:

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

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



 类似资料:
  • 问题内容: 我想使用字典在python中调用一个函数。 这是一些代码: 这可以打印,但我希望只打印test。 我希望它可以类似地工作以获取更多参数: 这可能吗? 问题答案: 最后自己解决了。很简单,我只是缺少运算符来解开字典 因此,我的示例变为:

  • 问题内容: 我很好奇Go中是否有可能。我有多种方法的类型。是否可以有一个函数,该函数需要一个方法参数,然后将其称为类型? 这是我想要的一个小例子: Go认为type 有一个称为的方法,而不是用传入的方法名称替换它。 问题答案: 是的,有可能。您有2(3)个选项: 规范:方法表达式 该表达式产生的功能与第一个参数等效,但具有一个显式接收器。它有签名。 在这里,方法接收器是显式的。您只需将方法名称(具

  • 问题内容: 有没有更Python的方式来做到这一点? 问题答案: 您可以将它们添加到类似kwarg的列表中: if authenticate: connect_kwargs[‘password’] = “bar” connect_kwargs[‘otherarg’] = “zed” connect(**connect_kwargs) 当您可以将一组复杂的选项传递给函数时,这有时会很有帮助。在这种简

  • 问题内容: 我正在使用Go内置的http服务器,并拍拍来响应一些URL: 我需要向该处理函数传递一个额外的参数-一个接口。 如何向处理程序函数发送额外的参数? 问题答案: 通过使用闭包,您应该能够做您想做的事情。 更改为以下内容(未测试): 然后对

  • 我在解一个有很多常数的非线性方程 我创建了一个用于解决以下问题的函数: 然后我想做: 但是正在解包并向函数传递太多参数,因此我得到: TypeError:terminalV()正好接受2个参数(给定6个) 那么,我的问题是,我是否可以通过某种方式将元组传递给调用的函数?

  • 问题内容: 假设我有一些功能,: 现在,如果我有一个字典,例如,我可以调用并打印结果。 但是,假设我有一本字典。如果我打电话给我 很公平。但是,无论如何,在其定义或调用中,是否要告诉Python仅忽略不是参数名称的任何键?最好是一种可以指定默认值的方法。 问题答案: 作为@Bas发布答案的扩展,我建议将kwargs参数(可变长度关键字参数)添加为函数的第二个参数 这一定足以满足 只忽略不是参数名称