Я хотел бы сделать что-то похожее на постоянное свертывание с использованием Python.
Python имеет удобную встроенную функцию eval(), так что только константные уравнения можно легко сложить, применив eval().
Пример:
s = '4 + (5) * 2'
reduced_s = str(eval(s)) # '14'
Однако свертывание констант, которое я хочу реализовать, должно обрабатывать непостоянные метки.
Примеры:
s = '_tbl + (2) + (2) * 4'
should be folded to '_tbl + 10'.
Если постоянные части разделены меткой, например (s = '2 + _tbl + 4'), должно получиться '_tbl + 6' (или '6 + _tbl).
Я написал процедуру свертывания констант, используя «C» много лет назад. Это была непростая процедура, так как мне нужно было построить дерево и оценить приоритет операторов.
Поскольку Python гораздо более мощный язык, чем «C», прежде чем делать то же самое с помощью Python, я хотел бы узнать мнение других людей.
Мы очень ценим ваше понимание этой проблемы.
'_tbl + (2) + (2) * 4'
в строку'_tbl + 10'
? Для чего вы используете струны? - person BrenBarn   schedule 02.02.2015eval
; есть ещеexec
. Но это не значит, что вы должны их использовать. :) В общем, настоятельно рекомендуется организовать свой код так, чтобы вам не нужно было использоватьeval
. Например, вы можете вычислять постоянные значения в глобальном контексте скрипта, чтобы они не вычислялись каждый раз, когда вы вызываете функцию; вы можете составлять списки или словари лямбда-выражений; вы можете использовать частичные функции; и т.п. - person PM 2Ring   schedule 02.02.2015eval
используете строки, полное содержание которых известно только во время выполнения, вы должны быть очень осторожны, чтобы гарантировать, что опасный код не будет выполнен. См. Eval действительно опасен от ТАКОГО обычного Неда Батчелдера. Но если вы действительно хотите использоватьeval
-подобный подход, а не методы, упомянутые в моем предыдущем комментарии, вы можете использовать ast.literal_eval(). - person PM 2Ring   schedule 02.02.2015ast
, анализировать выражение в AST, а затем применять их постоянное свертывание к AST, а затем преобразовывать AST обратно в код Python. - person Dan D.   schedule 02.02.2015