Я часто нахожусь в ситуации, когда у меня есть переменная, которая может или не может быть списком элементов, по которым я хочу перебрать. Если это не список, я сделаю из него список, чтобы я мог его перебирать. Таким образом, мне не нужно писать код внутри 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 в качестве одного элемента.