关于if语句:python:检查对象是否是序列

Python: check if an object is a sequence

在Python中,有没有一种简单的方法来判断某个东西是否不是序列?我试着这么做:if x is not sequence但是python不喜欢那样


如果xTypeErroriter(x)将提高,但不能在线迭代检查的"接受",它"集和辞典,虽然其他非rejects"这样的None和序列号。

在其他的手,一弦(最想考虑的应用,而不是"单个项目"是在事实的序列(序列)的操作系统,任何测试,除非它是一specialcased字符串是要证实他们是)。简单的操作系统,这样的检查通常是不足够的。

在Python 2.6和更好的抽象基类,其强大的功能和原理,在其他系统的支持,他们提供更多的好,这样的"类检查"。

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 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

你仍然是一个值得注意的字符串"序列"(因为他们),但至少你得到dicts和列出的方法。如果你想排除的字符串的概念"来自你的人,你可以使用collections.MutableSequence序列"(但这也excludes元组,这样序列,字符串是不可变的,但是是很明确的:),或

1
2
3
4
5
6
import collections

def issequenceforme(obj):
    if isinstance(obj, basestring):
        return False
    return isinstance(obj, collections.Sequence)

对季节的味道,和它的热!-)


我认为下面的代码片断:不是你想要的

1
2
def is_sequence(obj):
    return hasattr(type(obj), '__iter__')


由于Python的一个adheres"鸭打字的方法,是检查,如果有一些部件(面向对象方法)。

蛛网膜下腔出血蛛网膜下腔出血(SAH)的全长序列,序列和支持的项目,【DOC】切片。所以,这将是像这样:

1
2
3
4
def is_sequence(obj):
    t = type(obj)
    return hasattr(t, '__len__') and hasattr(t, '__getitem__')
    # additionally: and hasattr(t, '__setitem__') and hasattr(t, '__delitem__')

他们都是特殊的方法,__len__()应该返回的项目数,如果返回一个项目(在__getitem__(i)TH序列,它是一项与映射,但不应该返回,__getitem__(slice(start, stop, step))subsequence),和__setitem____delitem__你期望的一样。这是这样一个合同,但是否真的对这些对象或不取决于是否或不是对象adheres合同。

请注意,该函数也将返回,在True映射是映射的,如从dict,也有这些方法。这对克服工作的比率,也就是比较丰满的,你可以:

1
2
3
4
5
6
7
def is_sequence(obj):
    try:
        len(obj)
        obj[0:0]
        return True
    except TypeError:
        return False

但大部分时间你不需要这个,你想要去的,如果对象是一个序列和捕获异常如果你愿意的话。这是更多的Python。


2.6.5《Python文档介绍以下序列类型:字符串,字符串,列表,数组,缓冲区,和xrange。

1
2
def isSequence(obj):
    return type(obj) in [str, unicode, list, tuple, buffer, xrange]


在Python 2.6和3 +,你可以检查,如果它的collections.Sequence亚纲:

1
2
3
>>> import collections
>>> isinstance(myObject, collections.Sequence)
True

你必须使用Python中的collections.abc.Sequence(3.7 3.8 collections.Sequence将Python中的情况):

1
2
3
>>> import collections.abc
>>> isinstance(myObject, collections.abc.Sequence)
True

然而,这不会工作,实现__len__()鸭型序列和__getitem__()(但他们不应该collections.Sequence)的子类。但它会工作的所有Python内置序列类型:字符串,列表,元组,等。

在所有的序列学习是学习,不全是(例如,序列集和辞书为迭代变量,但不序列)。校验和是hasattr(type(obj), '__iter__')将返回True字典集。


你为什么这样做?在正常的方式是要求对某些类型的东西(或序列号或文件类对象等),然后使用它,在没有任何检测。在Python中,我们不使用语义信息来进行typically类的使用方法,简单的定义的(但这一个被称为"鸭打字")。我们也知道,我们是在选择原料药会怎么做;使用关键字参数,确定一个函数的preprocessing,或如果你想改变如何函数工作。


为什么要问为什么

"如果要返回的长度。

1
2
3
4
5
6
def haslength(seq):
    try:
        len(seq)
    except:
        return False
    return True