自定义参数 TypeError 消息

Custom argumental TypeError messages

我想 return 根据 TypeError 的具体原因自定义一组消息。

def f(x, y):
    value = x + y
    return "Success! ({})".format(value)

def safe(function, *args):
    try:
        result = function(*args)
    except TypeError:
        if "not_enough_args":  # What actual condition can go here?
            return "Not enough arguments."
        elif "too_many_args":  # What actual condition can go here?
            return "Too many arguments."
        else:
            return "A TypeError occurred!"
    else:
        return result

safe(f, 2)  # "Not enough arguments."
safe(f, 2, 2)  # "Success!"
safe(f, 2, 2, 2)  # "Too many arguments."
safe(f, '2', 2)  # "A TypeError occurred!"

最好使用实际的 TypeError 对象。

以下是您问题的可能解决方案:

def f(x, y):
    value = x + y
    return "Success! ({})".format(value)


def safe(function, *args):
    try:
        result = function(*args)
    except TypeError as e:
        return str(e)
    else:
        return result


def safe2(function, *args):
    try:
        result = function(*args)
    except TypeError as e:
        if "required positional argument" in str(e):
            return "Not enough arguments."
        elif "positional arguments but" in str(e):
            return "Too many arguments."
        else:
            return "A TypeError occurred!"
    else:
        return result

print(safe(f, 2))
print(safe(f, 2, 2))
print(safe(f, 2, 2, 2))
print(safe(f, '2', 2))
print('-' * 80)
print(safe2(f, 2))
print(safe2(f, 2, 2))
print(safe2(f, 2, 2, 2))
print(safe2(f, '2', 2))

如果您不需要确定引发了哪个 TypeError(安全),返回异常就可以完成工作。如果不是 (safe2),您可以以某种方式将异常解析为字符串。

如果您不想解析字符串和自定义 TypeError 异常,那么您只需要将 TypeError 子类化,因为 existing hierarchy 不提供您对它的专门化。

我不会胡思乱想改变异常对象的性质,并使用一长串条件语句来打印您自己的自定义消息。而只是 return 返回异常对象。您可以在 except 行中执行此操作:

except TypeError as e

所以,现在您将拥有 TypeError 异常的对象 e。从那里,手头有东西,你可以做任何你想做的事。

观察下面的例子。无论发生什么异常,你都会得到,你不会修改它的性质,而是你按原样使用对象,你可以打印出遇到失败的确切消息。

def f(x, y):
    value = x + y
    return "Success! ({})".format(value)

def safe(function, *args):
    try:
        result = function(*args)
    except TypeError as e:
        return e
    else:
        return result

print(safe(f, 5, 6, 7))
# f() takes 2 positional arguments but 3 were given
print(safe(6))
# 'int' object is not callable

此外,您可以在 safe 方法之外执行的操作,您可以简单地检查从 safe 方法返回的类型并采取相应的行动。

示例:

result = safe(5)
if type(result) is TypeError:
    print(result)