Если вы настаиваете на том, чтобы использовать для своих выражений язык, резко отличающийся от языка Python (в котором все функции всегда вызываются в скобках, в то время как вы хотите разрешить вызов нескольких функций без - allow2x
для обозначения 2 * x
- и т. Д.), Вам сначала нужно проанализировать строку, например, с помощью pyparsing (автономное решение) или ply ("python lexx и yacc"), если вам нужен более традиционный подход, основанный на лексическом анализаторе и отдельном "компиляторе компилятора" (это то, что обозначают два "c" в yacc: компилятор еще одного компилятора).
Исходя из результатов этого парсера, вы можете сгенерировать синтаксис Python для компиляции - однако, нет реальной причины генерировать lambda
вместо простого def
, так как вам придется скомпилировать либоиз них все равно.Таким образом, думать о подходе как о «учебнике по лямбдам» было бы очень странно, поскольку решение использовать lambda
было бы произвольным и весьма спорным.
Мы говорим о стоимости нескольких часовпрограммирование и, вероятно, более 100 строк получившегося кода Python, если вы надеетесь на какую-либо ясность.Я считаю, что это определенно выходит за рамки того, что задумано как обычная сфера для вопросов и ответов SO.
Значительно меньше работы было бы для генерации закрытого типа байт-кода (и для этого частного интерпретатора в Python.код) - но тогда lambda
(что даже в заголовке вашего вопроса, поясняющего, что вы полностью поглощены важностью использования этого ключевого слова в решении) было бы еще безумнееиспользовать (поскольку очевидный подход к реализации этого варианта заключается в том, чтобы вместо этого возвращать в качестве «функции» связанный метод экземпляра соответствующего пользовательского класса - чтобы данные «bytecode» и простой интерпретатор в python могли быть соответствующим образомсвязаны друг с другом).
lambda
выжили в Python (и неохотно, потому что Гвидо изначально стремился удалить его при переходе к Python 3, и спал только тогда, когда столкнулся с «массовым восстанием», вызывающим следующую точку... ;-) по одной причине: потому что есть большое количествотривиально простых задач (функция, возвращающая константу, одна, возвращающая в точности свой аргумент и т. д.), которые очень короткие lambda
, с , все ограничения, связанные с его телом, являютсяпросто выражение, удобное для выполнения.Поэтому растягивать лямбды в Python за пределами этой чрезвычайно ограниченной роли (как вы, очевидно, очень хотите) - это довольно плохая идея.