【问题标题】:Python calling out positional argumentPython调用位置参数
【发布时间】:2016-07-24 04:01:11
【问题描述】:

我有一个 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:那行不通。它将'File1.txt' 分配给a,并将'File2.txt' 分配给b
  • 是的,你说得对。因此,在 2.5 的情况下,可能的解决方案是使用 kwargs 而不是 b、c、d、e、f 参数。
  • @AndreyT 不是Python 2.5特有的,对吧?我们可以说它适用于Python>2.5 吗?我在Python 2.7 上试过这个,并将File2.txt 分配给b
  • @malhar:这有点特定于 2.x。在 3.x 中,我们可以使用以下定义:def f(a, *args, b=1, c=2, etc=3)

标签: python parameters arguments positional-parameter


【解决方案1】:

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

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

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

【讨论】:

  • "为了论证,函数定义不能修改或重构。"
  • Foo.func_defaults 是我错过的关键部分。谢谢!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    Foo('me@domain.com', 'Silly', 'Walks', 'Spam', 'Eggs', 'Ni', 'File1.txt', 'File2.txt')
    

    【讨论】:

    • 所以你的回答是“有没有一种语法,我可以用第一个必需的参数和我的(可变数量的)附加字符串来简洁地调用 Foo?”没有”?你确定这是唯一的方法吗?
    • 抱歉没有准确回答问题。据我所知,这是不可能的。我将编辑我的答案。
    猜你喜欢
    • 2017-11-20
    • 2017-10-23
    • 2017-01-03
    • 2015-06-19
    • 1970-01-01
    • 2016-01-08
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多