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

带* args和** kwargs的默认参数

楚弘益
2023-03-14
问题内容

Python的2.x的 (我用2.7),这是使用默认参数用正确的方式*args**kwargs
我已经找到了与此主题相关的SO问题,但这是针对 Python 3的
使用 args,*
kwargs和可选的/默认参数调用Python函数

在那里,他们说此方法有效:

def func(arg1, arg2, *args, opt_arg='def_val', **kwargs):
    #...

在2.7中,结果为SyntaxError。有没有推荐的方法来定义这种功能?
我以这种方式工作,但我猜有更好的解决方案

def func(arg1, arg2, *args, **kwargs):
    opt_arg ='def_val'
    if kwargs.__contains__('opt_arg'):
        opt_arg = kwargs['opt_arg']
    #...

问题答案:

只需将默认参数放在*args

def foo(a, b=3, *args, **kwargs):

现在,b如果将其作为关键字参数或第二个位置参数传递,则将进行显式设置。

例子:

foo(x) # a=x, b=3, args=(), kwargs={}
foo(x, y) # a=x, b=y, args=(), kwargs={}
foo(x, b=y) # a=x, b=y, args=(), kwargs={}
foo(x, y, z, k) # a=x, b=y, args=(z, k), kwargs={}
foo(x, c=y, d=k) # a=x, b=3, args=(), kwargs={'c': y, 'd': k}
foo(x, c=y, b=z, d=k) # a=x, b=z, args=(), kwargs={'c': y, 'd': k}

请注意,尤其foo(x, y, b=z)不能使用,因为b在这种情况下是按位置分配的。

该代码也可以在Python 3中使用。在Python 3中将默认arg放在 后面 *args,使其成为“仅关键字”参数, 只能
按名称指定,不能按位置指定。如果要在Python 2中使用仅关键字的参数,则可以使用@mgilson的解决方案。



 类似资料:
  • 问题内容: 在python中,我可以定义一个函数,如下所示: 在这种情况下,我可以将func称为: 我还可以将函数定义为: 可以称为 最后,我可以结合两种形式 但是,不起作用的是调用: 我最初的想法是,这可能是因为一个函数 可以称为 因此,这将在将3打包到args还是kwargs中引入一些歧义。但是,在python 3中,可以指定仅关键字参数: 这样看来,在以下方面似乎没有语法歧义: 但是,这仍然

  •   *args 和 **kwargs 都允许将可变数量的参数传递给函数。当不确定要在函数中传递的参数数量时,将使用它们。   *args 允许你将可变数量的参数传递给函数。 def addNumbers(*numbers):     sum = 0     for number in numbers:         sum = sum + number     print("Sum: "

  • 问题 你有一个函数或方法,它使用*args和**kwargs作为参数,这样使得它比较通用, 但有时候你想检查传递进来的参数是不是某个你想要的类型。 解决方案 对任何涉及到操作函数调用签名的问题,你都应该使用 inspect 模块中的签名特性。 我们最主要关注两个类:Signature 和 Parameter 。下面是一个创建函数前面的交互例子: >>> from inspect import Si

  • 问题内容: 我正在尝试使用具有抽象基类的Python类型注释来编写一些接口。有没有一种方法来注释可能的类型和? 例如,如何表达一个函数的明智参数是一个或两个?给出,所以我的猜测是将类型注释为,但这是行不通的。 来自mypy的错误消息: Mypy不喜欢此函数调用是有道理的,因为它希望调用本身中包含a。解压后的附加内容还会产生我不理解的输入错误。 一个人如何诠释明智的类型和? 问题答案: 对于可变位置

  • 我正在用抽象基类尝试Python的类型注释来编写一些接口。有没有办法注释和的可能类型? 例如,如何表示函数的合理参数是一个或两个s给出了,所以我猜应该将该类型注释为,但这不起作用。 来自mypy的错误消息: mypy不喜欢函数调用这样是有道理的,因为它期望调用本身中有一个。开箱后的添加也给出了一个我看不懂的打字错误。 如何注释和的合理类型?

  • 用*args和**kwargs只是为了方便并没有强制使用它们. 当你不确定你的函数里将要传递多少参数时你可以用*args.例如,它可以传递任意数量的参数: >>> def print_everything(*args): for count, thing in enumerate(args): ... print '{0}. {1}'.format(count, thing) ..