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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何确定Python类型错误的原因相关的知识,希望对你有一定的参考价值。

我当前正在使用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
答案

将抛出您感兴趣的异常的部分与抛出无关异常的部分分开:

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)]

但请注意documentation

检查isinstance(obj, Iterable)会检测注册为Iterable或具有__iter__()方法的类,但它不会检测使用__getitem__()方法迭代的类。确定对象是否可迭代的唯一可靠方法是调用iter(obj)

以上是关于如何确定Python类型错误的原因的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 python 中处理 graphql 查询和片段?

在python 3.6中处理自定义编码时遇到类型错误

错误:E/RecyclerView:未连接适配器;跳过片段上的布局

ListView 未显示在片段中

如何确定“BUS-Error”的原因

FragerLayout在片段内提供Measure.EXACTLY错误