功能参数未经验证

时间:2017-02-03 03:17:58

标签: python python-2.7 python-3.x

我正在尝试在python中开发一个简单的计算器函数,其中函数签名可能超过2个,默认操作将是ADD,默认输出格式将是浮点数。

def calculator(operation=ADD,output=float,*args):

基本上该函数应该将操作应用于前两个数字,然后将其再次应用于结果和下一个数字,依此类推。例如,如果数字是6,4,9和1,并且操作是减法,则函数应返回6 - 4 - 9 - 1.

然而,当我用:

调用该函数时
calculator(1,2,3,4,operation=ADD,output=float)

我收到错误:

TypeError: calculator() got multiple values for argument 'operation'

有人可以告诉我应该如何使用正确的参数调用此函数?

4 个答案:

答案 0 :(得分:2)

先放*args。它将整数解释为operation的值,它期待一个字符串。

答案 1 :(得分:1)

您可以定义一个功能:

def calculator(operation, output, *args):
    pass

您可以将其用于:

calculator('ADD', 'float', 1, 2, 3, 4)

你的论点是位置的,所以如果你打电话:

calculator(1,2,3,4,operation=ADD,output=float)

你实际上是在说操作= 1且输出= 2,这就是解释器抱怨传递值两次的原因。

答案 2 :(得分:0)

当你打电话给你的功能时

def calculator(operation=ADD, output=float, *args):
    ...

calculator(1,2,3,4,operation=ADD,output=float)类似,参数首先按位置1,2,3,4分配,然后按密钥字operation=ADD, output=float分配,以便您获得操作 = 1,输出 = 2而 args 得到其余的(3,4),然后它尝试分配关键字参数,但事实证明操作已经因此分配了错误。

因此,使用您当前的定义将其命名为calculator(ADD,float,1,2,3,4)或将定义更改为

def calculator(*args, operation=ADD, output=float):
    ...

这样操作输出只是关键字参数,您可以像calculator(1,2,3,4,operation=ADD,output=float)之前那样调用它。

但是这个语法只是python 3,要在你需要做的python 2中做同样的事情

def calculator(*args, **kwarg):
    operation = kwarg.get("operation",ADD)
    output = kwarg.get("output",float)
    ...

答案 3 :(得分:0)

你可能应该使用args,kwargs。这里给出了一个很好的教程。 https://www.unixmen.com/introduction-python-args-kwargs-beginners-part-1/

>>> def calculator(*args, **kwargs):
...     for a in args:
...         print(a)
...     for k, v in kwargs.items():
...         print("%s := %s" % (k, v))
...
>>> calculator(1,2,3, op=add, ouput=float)
1
2
3
ouput := <class 'float'>
op := <built-in function add>