Я приведу пример, в котором я использовал eval
и где я думаю, что это был лучший выбор.
Я писал простую утилиту для тестирования программного обеспечения ... что-то, чтобы проверить, выполняет ли ученик упражнениясоответствовали требованиям назначения.Цель состояла в том, чтобы предоставить способ для простого файла конфигурации, служащего спецификацией теста (чтобы обойти проблему «куриного яйца» при использовании языка программирования для описания / документирования / реализации тестовых случаев для элементарных программных заданий).
Я основал свой жгут на ConfigParser в стандартных библиотеках.Тем не менее, я хотел иметь возможность представлять произвольные строки Python (включая интерполяции \ n, \ t и особенно любые интерполированные шестнадцатеричные символы ASCII в значениях, считанных из них.
Мое решение было try
вокругparsed_string=eval('''%s''' % cfg_read_item)
, за которым следует try
версии с тройными двойными кавычками ("" "% s" "") того же самого.
В этом случае альтернативой была бы запись (или найдите заранее написанный) анализатор языка Python и выясните, как включить и адаптировать его к моей программе. Риски минимальны (я не волнуюсь, что код, представленный студентом, обманет мой синтаксический анализатор, если он выйдет из тюрьмы,удалите все мои файлы, отправьте номера моей кредитной карты в Румынию и т. д.) *
* (отчасти потому, что я тестировал их под Linux из-за ненадежной учетной записи безголового пользователя).
Как здесьдругие говорили, что есть другие случаи использования, когда вы строите код из шаблона, основанного на входных данных, и вам необходимо выполнить этот код (метапрограммирование).быть в состоянии выполнить эти задачи по-другому.Однако всякий раз, когда эта альтернатива влечет за собой кодирование, которое подходит для написания синтаксического анализатора / компилятора / интерпретатора общего языка программирования ..., тогда eval
может быть лучшим подходом.