具有默认值的函数参数仍然是位置参数,因此您看到的结果是正确的。当您为参数指定默认值时,您并没有创建关键字参数。当函数调用未提供参数时,仅使用默认值。
>>> def some_function(argument="Default"):
... # argument can be set either using positional parameters or keywords
... print argument
...
>>> some_function() # argument not provided -> uses default value
Default
>>> some_function(5) # argument provided, uses it
5
>>> some_function(argument=5) # equivalent to the above one
5
>>> def some_function(argument="Default", *args):
... print (argument, args)
...
>>> some_function() #argument not provided, so uses the default and *args is empty
('Default', ())
>>> some_function(5) # argument provided, and thus uses it. *args are empty
(5, ())
>>> some_function(5, 1, 2, 3) # argument provided, and thus uses it. *args not empty
(5, (1, 2, 3))
>>> some_function(1, 2, 3, argument=5)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: some_function() got multiple values for keyword argument 'argument'
请注意最后一条错误消息:如您所见,1
被分配到argument
,然后 python 再次发现了keyword
引用argument
,因此引发了错误。仅在*args
分配所有可能的位置参数后才分配。
在 python2 中,除了 using 之外,没有其他方法可以定义仅限关键字的值**kwargs
。作为一种解决方法,您可以执行以下操作:
def my_function(a,b,c,d,*args, **kwargs):
default_dict = {
'my_keyword1': TheDefaultValue,
'my_keyword2': TheDefaultValue2,
}
default_dict.update(kwargs) #overwrite defaults if user provided them
if not (set(default_dict) <= set('all', 'the', 'possible', 'keywords')):
# if you want to do error checking on kwargs, even though at that
# point why use kwargs at all?
raise TypeError('Invalid keywords')
keyword1 = default_dict['keyword1']
# etc.
在 python3 中,您可以定义仅限关键字的参数:
def my_function(a,b,c,*args, keyword, only=True): pass
# ...
请注意,仅关键字并不意味着它应该具有默认值。