我当前正在使用try/except
块将特定变量视为可迭代,但是当它不可迭代时,它会以不同但正确的方式处理它。
我的问题是,除了尝试使用非迭代迭代之外,可能会抛出TypeException。我的检查是使用附加到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
答案 0 :(得分:3)
将抛出您感兴趣的异常的部分与引发无关异常的部分分开:
try:
iterator = iter(y)
except TypeError:
handle_that()
else:
do_whatever_with([orig[x].value.flatten() for x in iterator])
答案 1 :(得分:2)
如果适合您的使用案例,最好的方法是使用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)]
但请注意documentation:
检查
isinstance(obj, Iterable)
检测已注册的类 作为Iterable或具有__iter__()
方法,但它没有检测到 使用__getitem__()
方法迭代的类。唯一可靠的 确定对象是否可迭代的方法是调用iter(obj)
。