Как автоматически преобразовать все значения unicode в str в dict? [Дубликат]

Вы можете использовать метод расширения GetMigrations класса DatabaseFacade (возвращенный свойством Database для DbContext), чтобы получить список ожидающих имен миграции.

Затем вы можете получить услугу IMigrator и использовать метод Migrate , передающий каждое целевое имя миграции:

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;

DbContext db = ...;
var pendingMigrations = db.Database.GetPendingMigrations().ToList();
if (pendingMigrations.Any())
{
    var migrator = db.Database.GetService();
    foreach (var targetMigration in pendingMigrations)
        migrator.Migrate(targetMigration);
}

72
задан Phillip B Oldham 10 August 2009 в 12:51
поделиться

6 ответов

DATA = { u'spam': u'eggs', u'foo': frozenset([u'Gah!']), u'bar': { u'baz': 97 },
         u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])]}

def convert(data):
    if isinstance(data, basestring):
        return str(data)
    elif isinstance(data, collections.Mapping):
        return dict(map(convert, data.iteritems()))
    elif isinstance(data, collections.Iterable):
        return type(data)(map(convert, data))
    else:
        return data

print DATA
print convert(DATA)
# Prints:
# {u'list': [u'list', (True, u'Maybe'), set([u'and', u'a', u'set', 1])], u'foo': frozenset([u'Gah!']), u'bar': {u'baz': 97}, u'spam': u'eggs'}
# {'bar': {'baz': 97}, 'foo': frozenset(['Gah!']), 'list': ['list', (True, 'Maybe'), set(['and', 'a', 'set', 1])], 'spam': 'eggs'}

Предположения:

  • Вы импортировали модуль коллекций и можете использовать абстрактные базовые классы, которые он предоставляет
  • . Вы счастливы конвертировать, используя кодировка по умолчанию (используйте data.encode('utf-8'), а не str(data), если вам нужна явная кодировка).

Если вам нужно поддерживать другие типы контейнеров, то, надеюсь, очевидно, как следовать шаблону и добавьте к ним дела.

141
ответ дан RichieHindle 25 August 2018 в 22:21
поделиться
  • 1
    И что бы сделать, если некоторые значения являются списками / наборами / etc? – Phillip B Oldham 10 August 2009 в 13:12
  • 2
    @Philip: добавьте для них случаи. Ответ обновляется, а затем снова обновляется для вложенности контейнеров в контейнеры. – RichieHindle 10 August 2009 в 13:27
  • 3
    вы забыли кортеж и фризонсет, Ричи – SilentGhost 10 August 2009 в 13:31
  • 4
    Почему вы используете type(data)(map(convert, data)) вместо map(convert, data)? – Abbasov Alexander 12 July 2013 в 00:29
  • 5
    @AbbasovAlexander: чтобы вы вернули тот же тип, который вы положили, кортеж становится кортежем, список становится списком, набор становится набором и т. Д. – RichieHindle 12 July 2013 в 08:08

Чтобы сделать все встроенным (нерекурсивным):

{str(k):(str(v) if isinstance(v, unicode) else v) for k,v in my_dict.items()}
2
ответ дан Ben 25 August 2018 в 22:21
поделиться

Я знаю, что опаздываю на это:

def convert_keys_to_string(dictionary):
    """Recursively converts dictionary keys to strings."""
    if not isinstance(dictionary, dict):
        return dictionary
    return dict((str(k), convert_keys_to_string(v)) 
        for k, v in dictionary.items())
22
ответ дан Germano 25 August 2018 в 22:21
поделиться
  • 1
    Да, это похоже на правильный способ сделать это, встроенные и другие версии действительно недостаточно для реальных сценариев. Слишком плохо, нет надежного встроенного рекурсивного способа выполнить это. Или, может быть, на основе python str (...) json conventions? – jayunit100 15 September 2012 в 01:23
  • 2
    Это мой любимый, только конвертировать ключи, и это то, что я искал. Маленькая опечатка: вам нужен дополнительный () элемент возвращаемого аргумента dict (). – ggll 30 July 2013 в 13:45
  • 3
    Спасибо чувак. Все хорошо и полезно. Ура !! – ashim888 11 February 2016 в 11:00
  • 4
    Единственная проблема с этим решением заключается в том, что ваши ключи не все строки (т. Е. Тип int) – MrWonderful 14 March 2016 в 20:11
  • 5
    @MrWonderful и почему это? Я не вижу никакой проблемы при вызове str в int – Germano 15 March 2016 в 10:29

для не-вложенного dict (так как название не упоминает этот случай, это может быть интересно для других людей)

{str(k): str(v) for k, v in my_dict.items()}
2
ответ дан maxbellec 25 August 2018 в 22:21
поделиться

Если вы хотите сделать это inline и не нуждаетесь в рекурсивном спуске, это может сработать:

DATA = { u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }
print DATA
# "{ u'spam': u'eggs', u'foo': True, u'bar': { u'baz': 97 } }"

STRING_DATA = dict([(str(k), v) for k, v in data.items()])
print STRING_DATA
# "{ 'spam': 'eggs', 'foo': True, 'bar': { u'baz': 97 } }"
12
ответ дан Samuel Clay 25 August 2018 в 22:21
поделиться
  • 1
    Для 2.7 и далее это можно упростить следующим образом: { str(key):value for key,value in data.items() } – AnjoMan 13 May 2015 в 14:49
def to_str(key, value):
    if isinstance(key, unicode):
        key = str(key)
    if isinstance(value, unicode):
        value = str(value)
    return key, value

передать ключ и значение ему и добавить рекурсию к вашему коду для учета внутреннего словаря.

3
ответ дан SilentGhost 25 August 2018 в 22:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: