在 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) ..