当不满足参数数量时,返回TypeError中的函数参数

时间:2014-03-26 23:45:56

标签: python function arguments typeerror

我一直在创建自己的python文件,在其中创建我可以在绘图时调用的函数。这样我只需加载一个文件,其中包含各种函数,我可以使用这些函数调整结果,保持代码简单。

我想知道的是,是否可以返回缺少函数的参数,以及是否可以实现这一点?

为了说明我的意思,我定义了以下函数:

def func(integer, float):
    return integer / float

如果我现在将这个功能称为:

print func(2)

它会给出错误,表明它需要两个参数而一个缺失。

TypeError: func() takes exactly 2 arguments (1 given)

由于多年来我将扩展我的调整文件,我将忘记一些函数和所需的参数。因此,我希望返回一个错误,其中包含参数的名称。

因此,在示例的情况下,我希望返回类似的内容:

TypeError: func(integer, float) takes exactly 2 arguments (1 given)

我甚至不关心所需或给出的参数数量。我真正需要的只是func(integer, float),如果我错过了一个论点或给了一个太多的话。

这可能吗?

提前致谢!

3 个答案:

答案 0 :(得分:1)

我认为你不会真的想要这样做 - 但我想一个hacky方法是使用getargspec()模块中的inspect来确定“Python的名称和默认值函数的参数。“,然后在try / except blocks中包装所有函数调用。

>>> try:
        func(2):
    except TypeError as e:
        print "Error! The function expected {} args".format(getargspec(func).args)
        raise e
Error! The function expected ['integer', 'float'] args 
Traceback (most recent call last):
File "<input>", line 5, in <module>
TypeError: func() takes exactly 2 arguments (1 given)

你也可以把它包装成一个自定义异常,哪个子类TypeError(虽然这里我们假设TypeError被引发,因为函数没有传递正确数量的参数可能有点过分简化了。)

请注意,您无法在函数对象本身内添加代码来执行此操作,因为Python在执行函数体中的任何代码之前会引发TypeError异常。

>>> def another_func(arg1):
        print "Got inside the function - the arg was {}".format(arg1)
>>> another_func("hello")
Got inside the function - the arg was hello
>>> another_func()
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: another_function() takes exactly 1 argument (0 given)

答案 1 :(得分:0)

我终于设法编写了这段代码,希望有所帮助:

import inspect, traceback

def func(integer, float):
    return integer / float

if __name__ == "__main__":
    try:
        func(2)
    except TypeError:
        print "ERROR: 'func(a, b)' . a is an integer and b is a float"
        print traceback.format_exc()

输出:

  

错误:&#39; func(a,b)&#39; 。 a是整数,b是浮点数   追溯(最近的呼叫最后):
              文件&#34; c:/a/script.py" ;,第9行,in               FUNC(2)
  TypeError:func()只需要2个参数(给定1个)

答案 2 :(得分:0)

在玩完之后我找到了最能满足我的答案:

import sys
import numpy

def func(integer = float("nan"), number = float("nan")):
    if numpy.isnan(integer):
        print "Function syntax: func(integer, number)"
        sys.exit()
    return integer * number

func()
>>> Function syntax: func(integer, number)

func(1)
>>> nan

func(3,2)
>>> 6

通过将我的函数变量设置为NaN,我只能通过在调用函数时实际赋予它们来覆盖它们。但是,由于if语句,我实际上可以打印函数变量,而不是在调用时给出任何函数变量。