我是python的新手,需要一些帮助...
我正在实现一个接受“fringe”参数的通用搜索函数,它可以是多种类型的数据结构。
在搜索方法中我有一行:
fringe.push(item, priority)
问题是不同数据结构中的push方法需要不同数量的参数(一些需要优先级,一些不需要)。是否有一种优雅的方式来传递,并使“推”方法只需要从发送的参数列表中所需的args数量?
谢谢!
答案 0 :(得分:8)
获取不同数量的参数并仍然能够选择正确参数的方法是使用* args和** keyword_args参数。
来自Mark Lutz的Learning Python
书:
函数定义中的
*
和**
旨在支持包含任意数量参数的函数。两者都可以出现在函数定义或a中 函数调用,它们在两个位置都有相关的目的。
*
和**
如果你定义一个函数:
def f1(param1, *argparams, **kwparams):
print 'fixed_params -> ', param1
print 'argparams --> ', argparams
print 'kwparams ---->,', kwparams
你可以这样称呼它:
f1('a', 'b', 'c', 'd', kw1='keyw1', kw2='keyw2')
然后你得到:
fixed_params -> a
argparams --> ('b', 'c', 'd')
kwparams ---->, {'kw1': 'keyw1', 'kw2': 'keyw2'}
这样您就可以发送/接收任意数量的参数和关键字。 恢复关键字args的一个典型习惯如下:
def f1(param1, **kwparams):
my_kw1 = kwparams['kw1']
---- operate with my_kw1 ------
通过这种方式,您可以使用任意数量的参数调用您的函数,并使用它所需的函数 这种类型或参数在一些GUI代码中经常使用,如wxPython类定义和子类化以及函数currying,decorators等
函数调用中的*
和**
*
和**
参数在函数处理时被解压缩:
def func(a, b, c, d):
print(a, b, c, d)
args = (2, 3)
kwargs = {'d': 4}
func(1, *args, **kwargs)
### returns ---> 1 2 3 4
大!
答案 1 :(得分:2)
理论上,您可以使用inspect.getargspec(fringe)
来找出该方法所采用的参数。这将告诉你你可以传递的参数数量,但它非常混乱:
argspec = inspect.getargspec(fringe.push)
if len(argspec.args) >= 3 or argspec.varargs or argspec.keywords:
fringe.push(item, priority)
else:
fringe.push(item)
如果有必要,可以更加简单地请求原谅:
try:
fringe.push(item, priority)
except TypeError:
fringe.push(item)
当然更好的是确保push()
方法都具有一致的参数规范,但如果你不能这样做,那么使用try...except
。
答案 2 :(得分:1)
尝试以下代码段,
def push(item, priority=None):
print item,priority
args = (1,)
push(*args)
args = (1,2)
push(*args)
答案 3 :(得分:0)
你不能只使用默认参数值吗?
>>> def foo(a, b = 10):
... print a, b
...
>>> foo(1000)
1000 10
>>> foo(1000, 1000)
1000 1000
>>>
如果未提供参数b
,则默认为10
。