Я использовал eval()
в прошлом (и время от времени делаю это) для массирования данных во время быстрых и грязных операций. Он является частью инструментария, который можно использовать для выполнения работы, но не следует использовать НИКОГДА для всего, что вы планируете использовать в производстве , например для любых инструментов командной строки или сценариев, по всем причинам упоминается в других ответах.
Вы не можете доверять своим пользователям - когда-либо - делать правильные вещи. В большинстве случаев они это сделают, но вы должны ожидать, что они сделают все то, о чем вы никогда не думали, и обнаружите все ошибки, которых вы никогда не ожидали. Именно здесь eval()
превращается из инструмента в пассив.
Прекрасным примером этого будет использование Django при построении QuerySet
. Параметры, передаваемые в запрос, принимают ключевые аргументы, которые выглядят примерно так:
results = Foo.objects.filter(whatever__contains='pizza')
Если вы программно назначаете аргументы, вы можете подумать о том, чтобы сделать что-то вроде этого:
results = eval("Foo.objects.filter(%s__%s=%s)" % (field, matcher, value))
Но всегда есть лучший способ, который не использует eval()
, который передает словарь по ссылке:
results = Foo.objects.filter( **{'%s__%s' % (field, matcher): value} )
Делая это таким образом, он не только быстрее в плане производительности, но также безопаснее и более питоничен.
Мораль истории?
Использование eval()
- это ок для небольших задач, тестов и действительно временных задач, но плохо для постоянного использования, потому что почти наверняка всегда есть лучший способ сделать это !