• Как из строки получить словарь (из str в dict)?

    @Tishka17
    javedimka,
    Если у вас конфиг обрабатывается эвалом - это уже не конфиг, а скрипт. Соответственно, если ваша программа позволяет выполнять пользователю в ней произвольные скрипты, вы должны многое предусмотреть. Например, программа, работающая от рута скорее всего не должна исполнять скрипты заполненные обычным юзером, так как это будет повышение привилегий. Обычно конфиги программ же делают в любом текстовом формате как раз чтобы не дать простому юзеру своей ошибкой удалить все данные или сломать компьютер (да, евал может не просто вызвать сегфолт, а вызвать произвольную системнуюкоманду вполть до `rm -rf ~/*`)

    Если json в базе эвалом парсится быстрее чем с помощью json - это довольно странно и, вероятно, вы делаете что-то не то. Мой простой тест выдал такие результаты на парсинге эталонного набора (меньше - лучше)
    json - 1.034
    ujson - 0.344
     eval - 16.797


    Код теста:
    import json
    from timeit import timeit
    
    import ujson
    
    orig = {f"f{i}": list(range(i, i + 100)) for i in range(100)}
    data = json.dumps(orig)
    assert ujson.loads(data) == eval(data)
    
    n=1000
    print(" json", timeit('json.loads(data)', globals=globals(), number=n))
    print("ujson", timeit('ujson.loads(data)', globals=globals(), number=n))
    print(" eval", timeit('eval(data)', globals=globals(), number=n))


    Я не отрицаю, что eval действительно где-то может оказаться полезен именно для парсинга данных, но это должны быть данные правильным образом подготовленные, полученные из доверенного источника и, конечно, надо быть уверенным что это действительно нужная и не имеющая лучших альтернатив оптимизация
  • Как из строки получить словарь (из str в dict)?

    @Tishka17
    javedimka, не понимаю ваш сарказм. Можете развернуть?
  • Как из строки получить словарь (из str в dict)?

    @Tishka17
    Влад Григорьев, да при чем тут красота. Обычная дыра в приложении.
  • Как из строки получить словарь (из str в dict)?

    @Tishka17
    Все указанные решения работают в некоторых частных случаях и могут сломаться в любой момент.

    В общем случае, нет стандартного способа получить строку в указанном топикстартером виде и синтаксис он не указал, поэтому я предполагаю, что это результат какой-то разрушающей операции типа str от питоновского объекта. Если речь идёт действительно об str, то он вполне способен сгенерировать довольно разные строки, которые будут ломать любой из указанных способов.

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