3

我有一个 python 函数(python 2.5),其定义如下:

def Foo(a, b='Silly', c='Walks', d='Spam', e='Eggs', f='Ni', *addl):

whereaddl可以是任意数量的字符串(文件名)来做某事。

我对所有默认值都很好,但我有文件名要放入addl.

我倾向于做类似的事情:

Foo('me@domain.com', addl=('File1.txt', 'File2.txt'))

但这会出现以下错误:

TypeError: Foo() got an unexpected keyword argument 'addl'

是否有一种语法可以让我 Foo 只使用第一个必需参数和我的(可变数量)附加字符串来简洁地调用?或者我是否在进入addl参数范围之前重复指定了所有默认值?

为了论证,函数定义不能被修改或重构。

4

3 回答 3

2

好的,如果函数不能被修改,那为什么不创建包装器呢?

def foo_with_defaults(a, *addl):
    Foo(a, *(Foo.func_defaults + addl))

foo_with_defaults('me@domain.com', *('File1.txt', 'File2.txt'))
于 2016-04-04T14:56:15.017 回答
0

据我所知,这是不可能的。

首先你需要传递必需的 (a) 和默认的 (b, c, d, e, f) 参数,然后每个额外的参数都作为 *addl 传递:

Foo('me@domain.com', 'Silly', 'Walks', 'Spam', 'Eggs', 'Ni', 'File1.txt', 'File2.txt')
于 2016-04-04T14:51:21.807 回答
0

您试图addl用作关键字参数,但您将其定义为位置参数。*如果要调用以下函数,则应再添加一个Foo(addl=('File1.txt', 'File2.txt'))

def Foo(a, b='Silly', c='Walks', d='Spam', e='Eggs', f='Ni', **addl):
于 2016-04-04T15:05:49.493 回答