Проверьте, есть ли что-то в списке - PullRequest
21 голосов
/ 15 апреля 2010

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

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

Этот вопрос, должно быть, задавали раньше - однако мои поиски не помогли мне. Приветствия.

Ответы [ 4 ]

15 голосов
/ 15 апреля 2010

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

if not isinstance(a, basestring):
    ...
10 голосов
/ 15 апреля 2010

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

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

  1. Для выдачи ошибок, если вызывающий абонент предоставляет неверный тип.

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

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

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

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

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

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

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

7 голосов
/ 15 апреля 2010

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

Документирование функции.

5 голосов
/ 15 апреля 2010

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

if isinstance(a, list):
  ...

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

...