создать лямбда-функцию из строки **правильно**

Имея такую ​​строку, как

"2*(i+j) <= 100"

Я хочу сгенерировать соответствующую лямбда-функцию,

fn = lambda i,j: 2*(i+j) <= 100
  • Я могу сделать это с помощью eval, но я ищу менее опасный метод.

  • Я нашел

    import ast
    f = ast.Lambda('i,j', '2*(i+j) 

    но я не понял, как выполнить результат!

  • В идеале я хотел бы также автоматически выводить список параметров ('i','j') — прямо сейчас я просто использую re.findall('\w+'), но мне бы хотелось возможность правильно использовать существующие функции, такие как cos, вместо того, чтобы скрывать их как «ключевые слова».


Я просматривал Существует ли библиотека Python для обработки сложных математических наборов (созданных с использованием математической нотации построителя наборов)? и пытался выяснить, как лучше всего преобразовать нотацию построителя наборов в лямбда-выражения. для подачи на решатель ограничений.

В основном я хочу, чтобы ast.literal_eval также распознавал переменные.

В идеале, учитывая i >= 20я хотел бы получить обратно ((лямбда x: x >= 20), ['i']), который я мог бы затем передать непосредственно в ограничение.

13
задан Community 23 May 2017 в 12:02
поделиться