Как правило, строки (простые и Unicode) являются единственным итерируемыми, что вы хотите все-таки рассматривать как «отдельные элементы» - basestring
встроенных существует СПЕЦИАЛЬНО, чтобы позволить вам проверить для любого вида строк с isinstance
, так что это очень ООН -grotty для этого частного случая ;-).
Таким образом, мой подход, предложенный в самом общем случае:
if isinstance(input, basestring): input = [input]
else:
try: iter(input)
except TypeError: input = [input]
else: input = list(input)
Это способ лечения КАЖДОЙ итерации КРОМЕ строк в виде списка непосредственно, строк и чисел и другие не итерируемые как скаляры (быть нормированные в списки отдельных элементов).
Я явно делаю список из всех возможных итераций, поэтому вы ЗНАЕТЕ, что можете продолжить выполнение КАЖДОГО вида трюков списка - сортировка, повторение нескольких раз, добавление или удаление элементов для облегчения итерации и т. Д., Без изменение списка ACTUAL (если список действительно был ;-). Если все, что вам нужно, это одна простая for
петли то, что последний шаг не является обязательным (и действительно бесполезно, если, например, ввод представляет собой огромный открытый файл), и я хотел бы предложить вспомогательный генератор вместо:
def justLoopOn(input):
if isinstance(input, basestring):
yield input
else:
try:
for item in input:
yield item
except TypeError:
yield input
теперь каждом одна из функций, требующих такой аргумент нормализации, вы просто использовать:
for item in justLoopOn(input):
вы можете использовать вспомогательную нормализующее-функцию даже в другом случае (если вам нужен реальный список для дальнейшего гнусных целей); на самом деле, в таких (более редких) случаях, вы можете просто сделать:
thelistforme = list(justLoopOn(input))
так, что (неизбежно) несколько опушенные логика нормализации только в одном месте, так же, как это должно быть -)
re: правильный. В Python обычно термин «Pythonic». Он признает, что есть много способов сделать что-то, но некоторые из них более соответствуют духу языка. –