Убедитесь, что переменная является списком - PullRequest
0 голосов
/ 23 февраля 2020

Я часто нахожусь в ситуации, когда у меня есть переменная, которая может или не может быть списком элементов, по которым я хочу перебрать. Если это не список, я сделаю из него список, чтобы я мог его перебирать. Таким образом, мне не нужно писать код внутри l oop дважды.

def dispatch(stuff):
   if type(stuff) is list:
       stuff = [stuff]

   for item in stuff:
      # this could be several lines of code
      do_something_with(item) 

Что мне не нравится в этом, так это (1) две дополнительные строки (2) проверка типов, которая обычно не рекомендуется (3), кроме того, я действительно должен проверять, является ли материал повторяемым, потому что это также может быть кортеж, но тогда он становится еще более сложным . Дело в том, что любое надежное решение, которое я могу придумать, включает в себя неприятный объем стандартного кода.

Вы не можете гарантировать, что материал является списком, написав for item in [stuff], потому что он создаст вложенный список, если материал уже является списком, и не будет перебирать элементы в материале. И вы тоже не можете сделать for item in list(stuff), потому что конструктор списка выдает ошибку, если вещи не повторяемы.

Итак, я хотел бы задать вопрос: есть ли что-то очевидное, что я упустил из-за эффекта ensurelist(stuff), и если нет, то можете ли вы вспомнить причину, по которой такая функциональность не стала легко доступной? по языку?

Редактировать: В частности, мне интересно, почему list (x) не позволяет x быть не повторяемым, просто возвращая список с x в качестве одного элемента.

1 Ответ

0 голосов
/ 24 февраля 2020

Рассмотрим пример классов, определенных в модуле io, которые предоставляют отдельные методы write и writelines для записи одной строки и записи списка строк. Обеспечить отдельные функции, которые делают разные вещи. (Один может даже использовать другой.)

def dispatch(stuff):
   do_something_with(item)


def dispatch_all(stuff):
    for item in stuff:
        dispatch(item)

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

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