Проверьте, является ли что-то списком

Что состоит в том, чтобы проверить самый легкий путь, является ли что-то списком?

Метод doSomething имеет параметры a и b. В методе это циклично выполнится через список a и сделайте что-то. Я хотел бы способ удостовериться a a list, перед цикличным выполнением через - таким образом предотвращение ошибки или неудачного обстоятельства передачи в строке, затем возвращающей букву от каждого цикла.

Этот вопрос, должно быть, задали, прежде - однако мой гуглит, привел меня к сбою.Удачи.

22
задан Mike Graham 15 April 2010 в 15:32
поделиться

4 ответа

Чтобы включить больше вариантов использования, но по-прежнему обрабатывать строки как скаляры, не проверяйте, является ли список списком, убедитесь, что это не строка:

if not isinstance(a, basestring):
    ...
16
ответ дан 29 November 2019 в 04:54
поделиться

Проверка типов вредит универсальности, простоте и удобству сопровождения вашего кода. Он редко используется в хороших идиоматических программах на Python.

Есть две основные причины, по которым люди хотят выполнять проверку типов:

  1. Выдавать ошибки, если вызывающий указывает неправильный тип.

    Это не стоит вашего времени. Если пользователь предоставляет несовместимый тип для выполняемой вами операции, при достижении совместимости уже будет возникать ошибка. Вызывает беспокойство то, что это может произойти не сразу, но обычно это не занимает много времени и приводит к тому, что код становится более надежным, простым, эффективным и легким в написании.

    Часто люди настаивают на этом в надежде, что смогут уловить все глупости, которые может сделать пользователь. Если пользователь желает совершать сколь угодно глупые поступки, вы ничего не можете сделать, чтобы его остановить. Проверка типов в основном имеет потенциал для сохранения пользователя, который приходит со своими собственными типами, которые являются заменой заменяемых, или когда пользователь осознает, что ваша функция на самом деле должна быть полиморфной и предоставляет что-то другое, что может принять ту же операцию.

    Если бы у меня была большая система, в которой множество вещей, созданных множеством людей, должно было бы подходить друг к другу, я бы использовал такую ​​систему, как zope.interface , чтобы провести тестирование, чтобы все было правильно совмещено.

  2. Делать разные вещи в зависимости от типов полученных аргументов.

    Это ухудшает ваш код, потому что ваш API несовместим. Функция или метод должны делать одно, а не принципиально разные. Это в конечном итоге оказывается функцией, которую обычно не стоит поддерживать.

    Один из распространенных сценариев - иметь аргумент, который может быть либо foo, либо списком foos. Более чистое решение - просто принять список файлов foos. Ваш код проще и согласованнее. Если это важный и распространенный вариант использования только одного foo, вы можете подумать о наличии другого удобного метода / функции, которая вызывает тот, который принимает список foo, и ничего не теряет. Предоставление первого API было бы не только более сложным и менее согласованным, но и неработающим, если бы типы не соответствовали ожидаемым точным значениям; в Python мы различаем объекты на основе их возможностей, а не их реальных типов. Почти всегда лучше принять произвольную итерацию или последовательность вместо списка и всего, что работает как foo, вместо того, чтобы требовать, в частности, foo.

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

10
ответ дан 29 November 2019 в 04:54
поделиться

Я бы хотел способ убедиться, что a является списком, прежде чем переходить к циклу

Задокументируйте функцию.

7
ответ дан 29 November 2019 в 04:54
поделиться

Обычно проверка типов в Python считается плохим стилем, но попробуйте

if isinstance(a, list):
  ...

(я думаю, вы также можете проверить если .__ iter __ существует.)

5
ответ дан 29 November 2019 в 04:54
поделиться
Другие вопросы по тегам:

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