Python: проверьте, является ли объект последовательностью

В Python там простой способ сказать, не является ли что-то последовательностью? Я пытался просто сделать: if x is not sequence но Python не нравилось это

58
задан fikr4n 25 June 2015 в 07:56
поделиться

3 ответа

iter (x) вызовет TypeError , если x не может быть повторен, но эта проверка «принимает» наборы и словари, хотя и «отклоняет» другие непоследовательности, такие как Нет и числа.

С другой стороны, строки (которые большинство приложений предпочитают рассматривать как «отдельные элементы», а не последовательности) на самом деле являются последовательностями (так что любой тест, если только он не предназначен для строк, подтвердит, что они есть). Так что таких простых проверок часто бывает недостаточно.

В 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

Вы заметите, что строки по-прежнему считаются "последовательностью" (поскольку они являются ), но, по крайней мере, вы получаете диктовки и установки. Если вы хотите исключить строки из концепции «быть последовательностями», вы можете использовать collections.MutableSequence (но это также исключает кортежи, которые, как и строки, являются последовательностями, но не изменяемы), или здесь прямо:

import collections

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

Приправить по вкусу и подавать горячим! -)

67
ответ дан 24 November 2019 в 19:03
поделиться

Зачем вы это делаете? Обычный способ здесь - потребовать определенный тип вещи (Последовательность или число, или файлоподобный объект и т.д.), а затем использовать его, ничего не проверяя. В Python мы обычно не используем классы для передачи семантической информации, а просто используем определенные методы (это называется "утиная типизация"). Мы также предпочитаем API, где мы точно знаем, чего ожидать; используем аргументы ключевых слов, препроцессинг или определяем другую функцию, если вы хотите изменить работу функции.

-1
ответ дан 24 November 2019 в 19:03
поделиться

В документации Python 2.6.5 описаны следующие типы последовательностей: строка, строка Unicode, список, кортеж, буфер и xrange.

def isSequence(obj):
    return type(obj) in [str, unicode, list, tuple, buffer, xrange]
5
ответ дан 24 November 2019 в 19:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: