默认情况下,Python 中的所有方法都采用可变参数。
当你在方法的签名中定义一个参数时,你明确地使它成为必需的。在您的代码段中,您正在做的是给它一个默认值 - 而不是让它们成为可选的。
考虑以下:
>>> def func(a,b):
... a = a if a else 0
... b = b if b else 10
... return a+b
...
>>> a = b = None
>>> func(a,b)
10
>>> a = 5
>>> b = 2
>>> func(a,b)
7
>>> func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func() takes exactly 2 arguments (0 given)
在此代码段中,两者a
都是b
必需的,因为我没有定义任何默认值。它们不是可选的。
但是在您的代码段中,因为您在方法签名中为它们提供了默认值,所以它们看起来是可选的,但实际上它们只是分配了默认值。
>>> def func(a=0,b=10):
... return a+b
...
>>> func()
10
您可以通过检查方法主体内的参数列表来确认这一点:
>>> def func(a=b,b=10):
... print locals().keys()
...
>>> func()
['a', 'b']
让你的函数接受任意数量的参数的一种方法(换句话说,使它们都是可选的):
>>> def func(*args,**kwargs):
... print len(args),args
... print len(kwargs),kwargs
...
>>> func("hello","world",a=5,b=10)
2 ('hello', 'world')
2 {'a': 5, 'b': 10}
>>> func()
0 ()
0 {}
>>> func(1,2)
2 (1, 2)
0 {}
>>> func(a)
1 (5,)
0 {}
>>> func(foo="hello")
0 ()
1 {'foo': 'hello'}