假设你有这样的功能:
def example(var1=None,var2=None,var3=None,*multi_values):
print (var1,var2,var3,*multi_values)
Run Code Online (Sandbox Code Playgroud)
你可以绕过调用所有可选参数,只是添加到最后一个?
例:
>>> multi=range(3)
>>> example(???)
(None,"hi",None,(1,2,3))
Run Code Online (Sandbox Code Playgroud)
我不想这样做:
>>> multi=range(3)
>>> example(None,None,None,*multi) #bad -> this doesn't use the default values
Run Code Online (Sandbox Code Playgroud)
一种选择是将原型更改为可迭代的multi_values参数,而不是接受任意数量的参数:
def example(var1=None, var2=None, var3=None, multi_values=None):
if multi_values is None:
multi_values = []
# whatever
Run Code Online (Sandbox Code Playgroud)
然后你可以把函数称为
example(multi_values=multi)
Run Code Online (Sandbox Code Playgroud)
另一种选择是仅var1通过var3关键字参数接受:
def example(*multi_values, **kwargs):
var1 = kwargs.pop("var1", None)
var2 = kwargs.pop("var2", None)
var3 = kwargs.pop("var3", None)
if kwargs:
raise TypeError("Unknown keyword arguments")
# whatever
Run Code Online (Sandbox Code Playgroud)
在Python 3.x中,这是通过将支持var1通过var3 后的*multi_values说法:
def example(*multi_values, var1=None, var2=None, var3=None):
# whatever
Run Code Online (Sandbox Code Playgroud)
这与前一个示例基本相同,具有更好内省的额外优势.