Python эквивалент Ruby Array.wrap (item_or_array_like) - PullRequest
0 голосов
/ 20 июня 2020

У меня есть переменная, которая может быть 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, но я бы хотел избежать этого, если возможно. Бонус, если это небольшая библиотечная утилита.

...