Python具体数据类型检查

Python specific data type check

最好检查 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

`

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

例如:

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

你的想法是对的,但是 None 不是 class。它的类型是 NoneType,或者 type(None)。后者在 Python 2 和 3 中开箱即用。前者需要导入:from types import NoneType 并且仅在 Python 2.

中有效

你可以使用

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

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

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

作为对其他答案(正确答案)的补充,我会在需要此类测试的案例类型中添加评论。

区分字符串和标量类型

如果问题是区分字符串和数字,那么请求原谅而不是许可同样有效:

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

因为那是 Python 的心态,它通常使事情变得更简单,并且 它也处理了 a 是 None 的情况。如果有人试图防止这样的错误,那么让它发生然后捕获它可能会更容易。它还可以更可靠,因为它还可以处理人们没有想到的情况。

区分字符串和其他可迭代对象

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

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

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

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

根据我的经验,这是唯一真正建议使用 isinstance(x, (str,...)) 进行测试的情况。我很好奇有人认识别人吗?