我一直在创建自己的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)
,如果我错过了一个论点或给了一个太多的话。
这可能吗?
提前致谢!
答案 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语句,我实际上可以打印函数变量,而不是在调用时给出任何函数变量。