自定义参数 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)
我想 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)