有没有办法将可选parameter passing给函数?
有没有一种方法在Python中将可选parameter passing给一个函数,而在函数定义中有一些代码基于“只有通过可选参数”
Python 2文档7.6。 函数定义为您提供了几种检测调用者是否提供可选参数的方法。
首先,您可以使用特殊的forms参数语法*
。 如果函数定义的forms参数前面有一个*
,那么Python会使用任何与之前的forms参数(作为元组)不匹配的位置参数来填充该参数。 如果函数定义的前面有一个forms参数**
,那么Python将使用与前面的forms参数不匹配的任何关键字参数(作为字典)来填充该参数。 函数的实现可以检查这些参数的内容,以获得所需sorting的任何“可选参数”。
例如,下面是一个函数opt_fun
,它接受两个位置参数x1
和x2
,并查找另一个名为“optional”的关键字参数。
>>> def opt_fun(x1, x2, *positional_parameters, **keyword_parameters): ... if ('optional' in keyword_parameters): ... print 'optional parameter found, it is ', keyword_parameters['optional'] ... else: ... print 'no optional parameter, sorry' ... >>> opt_fun(1, 2) no optional parameter, sorry >>> opt_fun(1,2, optional="yes") optional parameter found, it is yes >>> opt_fun(1,2, another="yes") no optional parameter, sorry
其次,你可以提供一个默认的参数值,如None
,调用者永远不会使用。 如果参数具有此默认值,则知道调用方未指定参数。 如果参数有一个非默认值,你知道它来自调用者。
def my_func(mandatory_arg, optional_arg=100): print mandatory_arg, optional_arg
http://docs.python.org/2/tutorial/controlflow.html#default-argument-values
我发现这比使用**kwargs
更可读。
要确定一个参数是否被传递,我使用一个自定义的实用程序对象作为默认值:
MISSING = object() def func(arg=MISSING): if arg is MISSING: ...
def op(a=4,b=6): add = a+b print add i)op() [o/p: will be (4+6)=10] ii)op(99) [o/p: will be (99+6)=105] iii)op(1,1) [o/p: will be (1+1)=2] Note: If none or one parameter is passed the default passed parameter will be considered for the function.
如果你想在()中给参数赋值赋予一些默认值。 像(x = 10)。 但重要的是首先要强制性的论点,然后默认值。
例如。
(y,x = 10)
但
(x = 10,y)是错误的
你可以为可选参数指定一个默认值,这个值将永远不会传递给函数,并用is
运算符来检查它:
class _NO_DEFAULT: def __repr__(self):return "<no default>" _NO_DEFAULT = _NO_DEFAULT() def func(optional= _NO_DEFAULT): if optional is _NO_DEFAULT: print("the optional argument was not passed") else: print("the optional argument was:",optional)
那么只要你不做func(_NO_DEFAULT)
你就可以准确地检测出论证是否被通过了,而不像被接受的答案那样你不必担心**符号的副作用:
# these two work the same as using ** func() func(optional=1) # the optional argument can be positional or keyword unlike using ** func(1) #this correctly raises an error where as it would need to be explicitly checked when using ** func(invalid_arg=7)