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 от питоновского объекта. Если речь идёт действительно об str, то он вполне способен сгенерировать довольно разные строки, которые будут ломать любой из указанных способов.
Например, вариант с ремлейсом ломается если внутри уже есть кавычки. Вариант с эвалом не стоит советовать, так как на определенных данных он может привести к исполнению стороннего кода. Вариант с literal_eval сломается на сложных объектах (а так как мы не знаем, как автор получил свою строку, можно допустить, что там может быть что угодно)
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Если у вас конфиг обрабатывается эвалом - это уже не конфиг, а скрипт. Соответственно, если ваша программа позволяет выполнять пользователю в ней произвольные скрипты, вы должны многое предусмотреть. Например, программа, работающая от рута скорее всего не должна исполнять скрипты заполненные обычным юзером, так как это будет повышение привилегий. Обычно конфиги программ же делают в любом текстовом формате как раз чтобы не дать простому юзеру своей ошибкой удалить все данные или сломать компьютер (да, евал может не просто вызвать сегфолт, а вызвать произвольную системнуюкоманду вполть до `rm -rf ~/*`)
Если json в базе эвалом парсится быстрее чем с помощью json - это довольно странно и, вероятно, вы делаете что-то не то. Мой простой тест выдал такие результаты на парсинге эталонного набора (меньше - лучше)
Код теста:
Я не отрицаю, что eval действительно где-то может оказаться полезен именно для парсинга данных, но это должны быть данные правильным образом подготовленные, полученные из доверенного источника и, конечно, надо быть уверенным что это действительно нужная и не имеющая лучших альтернатив оптимизация