函数参数中元组的Python默认值

时间:2015-01-21 04:18:12

标签: python

据我所知,在python中你可以为这样的参数设置一个默认值:

 def func(self, arg='value'):
     #somecode

我有一个最多需要16个参数的函数,所以我希望将它们存储为元组。问题是我想为元组的某些值设置默认值,但不是整个事物。将默认元组设置为

def func(self, values=('foo', 'bar', 'foobar')):
如果我传入一个只有两个值的元组,那么

是否被覆盖?如果我这样做,例如:

 func(('bar', 'foo')

values ==('bar','foo'),not('bar','foo','foobar')。有解决方法吗?

提前致谢。

3 个答案:

答案 0 :(得分:4)

这是一种比目前接受的解决方案更易于管理的解决方案。它将使您可以轻松地将默认args声明为元组,而不是在函数签名中声明每个值的名称。 (想象一下,为4x4矩阵做这个!)

更新

你可以这样做:

def func(self, args):
    defaultargs = (1, 2, 3)
    args = tuple(map(lambda x, y: y if y is not None else x, defaultargs, args))

在这种情况下,不是在函数定义中使用默认的args,而是可以将其放在内部,并对每个元素执行或操作,如图所示。这样,任何在args中留空的位置都将被默认args元组中的相应位置填充。

这解决了以下评论中提到的警告。

答案 1 :(得分:3)

因此,如果我了解您的问题,那么您感兴趣的是* operator。它允许您从列表/元组中解包参数,如下所示:

def foo(a, b, c='l', d='l', e='o'):
    return ''.join((a,b,c,d,e))

tuple1 = ('H', 'e')
tuple2 = ('H', 'o', 'w', 'd', 'y')

foo(*tuple1)
>> "Hello"
foo(*tuple2)
>> "Howdy"

答案 2 :(得分:0)

使用

def func(self, *arg):

arg包含所有参数的列表,例如[' foo',' bar',' foobar'] 你可以使用arg [1]或arg [2] ......等来访问

您可以传递可变数量的参数,例如

func(('bar', 'foo')
func(('bar', 'foo','addjf')
func(('bar', 'foo','abc','xyz)