python中的泛型函数 - 调用具有未知数量参数的方法

时间:2011-11-16 06:43:57

标签: python generics

我是python的新手,需要一些帮助...

我正在实现一个接受“fringe”参数的通用搜索函数,它可以是多种类型的数据结构。

在搜索方法中我有一行:

 fringe.push(item, priority)

问题是不同数据结构中的push方法需要不同数量的参数(一些需要优先级,一些不需要)。是否有一种优雅的方式来传递,并使“推”方法只需要从发送的参数列表中所需的args数量?

谢谢!

4 个答案:

答案 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