Правильный способ определения параметра последовательности? - PullRequest
18 голосов
/ 20 ноября 2008

Я хочу написать функцию, которая принимает параметр, который может быть либо последовательностью, либо единственным значением. Тип значения - str, int и т. Д., Но я не хочу, чтобы его ограничивали жестко закодированным списком. Другими словами, я хочу знать, является ли параметр X последовательностью или чем-то, что я должен преобразовать в последовательность, чтобы избежать специального случая позже. Я мог бы сделать

type(X) in (list, tuple)

но могут быть другие типы последовательностей, о которых я не знаю, и нет общего базового класса.

-N.

Редактировать : см. Мой «ответ» ниже, почему большинство этих ответов мне не помогают. Может быть, вам есть что посоветовать.

Ответы [ 12 ]

0 голосов
/ 20 ноября 2008

Вы задаете не тот вопрос. Вы не пытаетесь обнаружить типы в Python; вы обнаруживаете поведение.

  1. Напишите другую функцию, которая обрабатывает одно значение. (давайте назовем это _use_single_val).
  2. Напишите одну функцию, которая обрабатывает параметр последовательности. (давайте назовем это _use_sequence).
  3. Напишите третью родительскую функцию, которая вызывает две вышеупомянутые. (назовите это use_seq_or_val). Окружите каждый вызов обработчиком исключения, чтобы перехватить недопустимый параметр (т. Е. Не одно значение или последовательность).
  4. Напишите модульные тесты для передачи правильных и неправильных параметров родительской функции, чтобы убедиться, что она правильно перехватывает исключения.

    def _use_single_val(v):
        print v + 1  # this will fail if v is not a value type

    def _use_sequence(s):
        print s[0]   # this will fail if s is not indexable

    def use_seq_or_val(item):    
        try:
            _use_single_val(item)
        except TypeError:
            pass

        try:
            _use_sequence(item)
        except TypeError:
            pass

        raise TypeError, "item not a single value or sequence"

РЕДАКТИРОВАТЬ: Пересмотрено для обработки "последовательности или одного значения", о котором говорится в вопросе.

0 голосов
/ 20 ноября 2008

Вы можете передать свой параметр во встроенную функцию len () и проверить, не вызывает ли это ошибку. Как уже говорили другие, тип строки требует специальной обработки.

Согласно документации, функция len может принимать последовательность (строку, список, кортеж) или словарь.

Вы можете проверить, что объект является строкой со следующим кодом:

x.__class__ == "".__class__
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...