У меня есть переменная, которая может быть Iterable
из Mapping
s или просто Mapping
, и я хотел бы привести ее к Iterable
из Mapping
s, аналогично тому, как Ruby s Array.wrap () работает. Это немного сложно, потому что Mapping
также является Iterable
, и если бы мне нужен метод общего назначения, я бы тоже не хотел, чтобы он обрабатывал строки как итерации. Это может быть непросто в python, потому что python не делает различий между неявными и явными преобразованиями, как это делает ruby.
В качестве конкретного примера предположим, что переменная может иметь следующий вид:
var1 = [{'foo': 'bar'}]
var2 = {'foo': 'bar'}
в случае var2
он должен быть «завернут» как var1
, но var1
в «завернутом» не должен быть изменен.
Я хочу пригнуться- введите это как можно больше, поэтому мне не нужно беспокоиться о c типах объектов. Я понимаю, что это проще с Sequence
s, но я не вижу причин, почему это не должно работать и с Set
s.
Но без этих ограничений вы можете попробовать что-то вроде этого:
def wrap(item_or_collection):
if isinstance(Sequence):
return item_or_collection
else:
return [item_or_collection]
Это работает за исключением случаев наборов, строк, байтов и некоторых других «неявных» последовательностей, которые на самом деле не являются означает коллекции в том же смысле, что и списки.
Итак, какие-нибудь идеи или улучшения? Я мог бы просто обработать все крайние случаи с вложением if
s, но я бы хотел избежать этого, если возможно. Бонус, если это небольшая библиотечная утилита.