Python特定的数据类型检查

时间:2018-02-28 07:07:38

标签: python exception-handling typeerror

最好检查var是否有str,unicode或None;但不是别的吗?

我试过

if not isinstance(ads['number'], (str, unicode, None)):
    ....

但得到以下异常:

TypeError: isinstance() arg 2 must be a class, type, or tuple of classes and types

`

4 个答案:

答案 0 :(得分:3)

你可以使用

if not isinstance(a, (str, unicode, type(None))):
    ....

并且在python 2中(您似乎正在使用),这也有效:

from types import NoneType
if not isinstance(a, (str, unicode, NoneType)):
    ....

答案 1 :(得分:2)

你有正确的想法,但None不是一个类。它的类型是NoneType,或type(None)。后者在Python 2和3中都是开箱即用的。前者需要导入:from types import NoneType并且只能在Python 2中使用。

答案 2 :(得分:1)

您可以使用类型查找方法并在列表中检查

<强>实施例

if type(None) in [str, unicode, type(None)]:
    print "ok"

答案 3 :(得分:1)

作为对其他答案(这是正确的)的补充,我会在案例类型中添加注释,其中需要进行此类测试。

区分字符串和标量类型

如果问题是区分字符串和数字,那么请求宽恕而不是许可也可以:

a = 1
try:
    b = a.upper()
except AttributeError:
    ...

由于这是Python的思维方式,它通常会使事情变得更简单,而它也会处理a为无的情况。如果一个人试图阻止这样的错误,那么可能更容易让它反而发生然后抓住它。它也可能更可靠,因为它也可以处理一个人们没有想过的案例。

区分字符串和其他可迭代

然而,一种情况是它不起作用的是当一个人想要来区分一个字符串和一个列表 (几个库用函数参数做这个)。问题是字符串和列表都是可迭代的,因此字符串可能会愉快地运行列表的代码而不会出现任何错误...除了现在您将字符串剪切成一个字符的片段。

>>> for el in a: print(el.upper())
...
H
E
L
L
O

(如果代码失败,错误可能会令人困惑。)为了避免这种影响:

a = "hello"
if isinstance(a, str):
    ...
else:
    ...

根据我的经验,这是唯一一个使用isinstance(x, (str,...))测试的唯一情况。我很想知道是否有人认识别人?