iter(x)
将提出一个TypeError
if x
不能迭代 - 但该检查“接受”集合和字典,尽管它“拒绝”其他非序列,例如None
和数字。
另一方面,字符串(大多数应用程序希望考虑“单个项目”而不是序列)are事实上序列(因此,任何测试,除非是针对字符串的特殊情况,都将确认它们是序列)。因此,这种简单的检查通常是不够的。
在 Python 2.6 及更高版本中,抽象基类被引入,除了其他强大的功能之外,它们还为这种“类别检查”提供了更好的、系统的支持。
>>> import collections
>>> isinstance([], collections.Sequence)
True
>>> isinstance((), collections.Sequence)
True
>>> isinstance(23, collections.Sequence)
False
>>> isinstance('foo', collections.Sequence)
True
>>> isinstance({}, collections.Sequence)
False
>>> isinstance(set(), collections.Sequence)
False
你会注意到字符串是still被认为是“一个序列”(因为它们are),但至少你得到了命令和设置。如果您想从“存在序列”的概念中排除字符串,您可以使用collections.MutableSequence
(但这也排除了元组,元组与字符串一样,是序列,但不可变),或者显式执行:
import collections
def issequenceforme(obj):
if isinstance(obj, basestring):
return False
return isinstance(obj, collections.Sequence)
调味,趁热享用!-)
PS:对于Python 3,使用str
代替basestring
,对于 Python 3.3+:抽象基类,例如Sequence
已经搬到collections.abc
.