如何确定Python类型错误的原因

3
我目前正在使用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

1
你能提供你正在使用的代码以及期望的结果吗? - johnashu
1
为什么你需要捕获它?为什么不先检查它是否可迭代,比如使用 hasattr(y, '_iter_')? - Sam Redway
1
@SamRedway:并非所有可迭代对象都有__iter__方法。 - user2357112
@user2357112 嗯?真的吗?我认为这就是可迭代对象的定义? - Sam Redway
@SamRedway,请看我的回答中的引语。__iter__不是类迭代的唯一方式。 - jpp
2个回答

4

将抛出你感兴趣的异常的部分与抛出不相关异常的部分分开:

try:
    iterator = iter(y)
except TypeError:
    handle_that()
else:
    do_whatever_with([orig[x].value.flatten() for x in iterator])

1

如果适用于您的用例,最好的方法是使用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 或具有 __iter__() 方法的类,但它无法检测使用 __getitem__() 方法进行迭代的类。确定对象是否可迭代的唯一可靠方法是调用 iter(obj)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接