如何确定Python类型错误的原因
我目前正在使用一个如何确定Python类型错误的原因,python,exception-handling,try-catch,Python,Exception Handling,Try Catch,我目前正在使用一个try/except块,在可能的情况下将某个特定变量视为可iterable,但在不可iterable时,用一种不同的、尽管正确的方式处理它 我的问题是,抛出TypeException的原因可能不是试图使用不可iterable进行迭代。我的检查是使用附加到TypeException的消息来确保这是原因,而不是不受支持的操作数 但作为异常的一部分的消息已被弃用。那么,我如何检查我的TypeException的原因呢 为了完整起见,我使用的代码与此非常相似:
try/except
块,在可能的情况下将某个特定变量视为可iterable,但在不可iterable时,用一种不同的、尽管正确的方式处理它
我的问题是,抛出TypeException的原因可能不是试图使用不可iterable进行迭代。我的检查是使用附加到TypeException的消息来确保这是原因,而不是不受支持的操作数
但作为异常的一部分的消息已被弃用。那么,我如何检查我的TypeException的原因呢
为了完整起见,我使用的代码与此非常相似:
try:
deref = [orig[x].value.flatten() for x in y]
except TypeError as ex:
if "object is not iterable" in ex.message:
x = y
deref = [orig[x].value.flatten()]
else:
raise
将引发您感兴趣的异常的部分与引发无关异常的部分分开:
try:
iterator = iter(y)
except TypeError:
handle_that()
else:
do_whatever_with([orig[x].value.flatten() for x in iterator])
如果适合您的用例,最好的方法是使用
collections.Iterable
。因为这是一项非常常见的任务,所以我倾向于将其包装在函数中:
from collections import Iterable
def iterify(obj):
return obj if isinstance(obj, Iterable) else [obj]
deref = [orig[x].value.flatten() for x in iterify(y)]
但请注意:
检查isinstance(obj,Iterable)
可检测已注册的类
作为Iterable或具有\uuuu iter\uuuu()
方法,但它不检测
使用\uuuu getitem\uuuu()方法进行迭代的类。唯一可靠的
确定对象是否可iter的方法是调用iter(obj)
你能提供你正在使用的代码和期望的结果吗..为什么你需要捕捉它?你为什么不先检查一下它是否合适。。。像hasattr(y,'.'u iter'.@SamRedway:不是所有的iterables都有一个\uu iter\uu
方法。@user2357112哈?真正地“我曾认为这是可数名词的定义?”桑雷德韦,见我回答中的引语<代码>\uu iter\uu
不是类可以迭代的唯一方式。