我可以有这样的代码:
def sum(a, b):
return a + b
# User chooses function and parameters
function = sum
params = {"a": 5, "b": 3}
try:
ret = sum(**params)
print(ret)
except TypeError:
# Function called with bad signature
print("Wrong parameters for the chosen function!")
except:
print("Internal error")
模块的用户将选择函数和params字典。该函数运行并且用户被告知sum的参数是否错误(因为调用具有不正确参数的函数会引发TypeError
)。如果该功能被窃听并引发其他类型的异常,则内部错误'显示。
嗯,差不多。由于在函数内部进行了错误的调用,sum
函数可能会出错并引发TypeError
。这应该被报告为内部错误。
如何在错误参数下调用sum
函数并在函数内引发TypeError
时避免误报?
答案 0 :(得分:2)
PEP-0362定义了一个有用的签名对象。它默认包含在Python 3.3+中,但there is a backport包含在早期版本中。
这是使用签名对象检查正确参数的代码:
import sys
try:
from inspect import signature
except ImportError:
from funcsigs import signature
def sum(a, b):
return a + b
# User chooses function and parameters
function = sum
params = {"a": 5, "b": 3}
try:
# Check signature
signature(function).bind(**params)
except TypeError:
# Function called with bad signature
print("Wrong parameters for function!")
sys.exit(1)
# Signature is fine, continue...
try:
ret = sum(**params)
print(ret)
except:
# Exception in function
print("Internal error")
答案 1 :(得分:1)
您有四个选项,其中没有一个是理想选择
手动定制所有功能。
使用函数内省检查参数是否对函数有效。这可能会遗漏边缘情况,例如带有通用装饰器的包装函数。请参阅ntrrgc的答案,了解如何检查此内容。
检查错误消息。但是,如果函数错误地调用另一个函数,则可以捕获内部错误。
没有生活。