假设你有这样的功能:
def example(var1=None,var2=None,var3=None,*multi_values):
print (var1,var2,var3,*multi_values)
你可以绕过调用所有可选参数并只添加最后一个参数吗?
示例:
>>> multi=range(3)
>>> example(???)
(None,"hi",None,(1,2,3))
我不想这样做:
>>> multi=range(3)
>>> example(None,None,None,*multi) #bad -> this doesn't use the default values
答案 0 :(得分:6)
一个选项是更改原型以将可迭代作为multi_values
参数,而不是接受任意数量的参数:
def example(var1=None, var2=None, var3=None, multi_values=None):
if multi_values is None:
multi_values = []
# whatever
然后你可以把这个函数称为
example(multi_values=multi)
另一种选择是仅通过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
在Python 3.x中,在{/ 1}} var1
参数之后通过var3
添加*multi_values
来支持此功能:
def example(*multi_values, var1=None, var2=None, var3=None):
# whatever
这与前一个示例基本相同,具有更好内省的额外优势。
答案 1 :(得分:3)
没有。您必须在* args值之前提供所有命名值。
但是,您可以使用** kwargs来获取其他命名参数。
def example(var1=None,var2=None,var3=None,**kwargs):
example(var4="something")