Python调用位置参数

3
我有一个Python函数(Python 2.5),定义如下:
def Foo(a, b='Silly', c='Walks', d='Spam', e='Eggs', f='Ni', *addl):

其中addl可以是任意数量的字符串(文件名),用于执行某些操作。

我对所有默认值都满意,但我有要放入addl的文件名。

我倾向于这样做:

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

但是会出现以下错误:
TypeError: Foo() got an unexpected keyword argument 'addl'

有没有一种语法可以仅使用第一个必需参数和我的(可变数量的)附加字符串来简洁地调用 Foo?或者我必须在打破 addl 参数范围之前冗余地指定所有默认值吗?
为了论证,函数定义不能被修改或重构。

只需解包元组,它应该可以正常工作:Foo('me@domain.com', *('File1.txt', 'File2.txt'))。 - AndreyT
2
@AndreyT:那样写是不行的。它会将 'File1.txt' 赋值给 a,并将 'File2.txt' 赋值给 b - zondo
1
没错,你说得对。因此,在2.5的情况下,可能的解决方案是使用kwargs代替b、c、d、e、f参数。 - AndreyT
@AndreyT 这不仅适用于 Python 2.5,对于 Python>2.5 也是成立的,对吗?我在 Python 2.7 上尝试过,同样将 File2.txt 赋值给了 b - malhar
@AndreyT:这样做的问题在于对使用Foo的所有其他代码产生了无法缓解的影响。 - MellowNello
1
@malhar:这有点特定于2.x版本。在3.x版本中,我们可以使用以下定义:def f(a,*args, b=1,c=2,etc=3) - AndreyT
3个回答

2

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

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

foo_with_defaults('me@domain.com', *('File1.txt', 'File2.txt'))

3
为了论证,函数定义无法被修改或重构。 - Kevin
Foo.func_defaults 是我缺失的关键部分。谢谢! - MellowNello

0
据我所知,这是不可能的。
首先,您需要传递所需的(a)和默认的(b、c、d、e、f)参数,然后每个附加参数都作为*addl传递:
Foo('me@domain.com', 'Silly', 'Walks', 'Spam', 'Eggs', 'Ni', 'File1.txt', 'File2.txt')

2
那么你对“是否有一种语法可以简洁地调用Foo,并只使用第一个必需参数和我的(可变数量的)附加字符串?”的回答是“不行”吗?你确定这是唯一的方法吗? - Kevin
抱歉没有准确回答问题。据我所知,这是不可能的。我会编辑我的回答。 - apr

0

您正在尝试将addl用作关键字参数,但您将其定义为位置参数。如果您想像这样调用函数Foo(addl=('File1.txt', 'File2.txt')),则应再添加一个*

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接