Обратите внимание, что принятые ответы работают только в том случае, если лямбда дана в отдельной строке. Если вы передадите его в качестве аргумента функции и захотите извлечь код лямбда-выражения как объект, проблема будет немного хитрой, поскольку inspect
даст вам всю строку.
Например, рассмотрим файл test.py
:
import inspect
def main():
x, f = 3, lambda a: a + 1
print(inspect.getsource(f))
if __name__ == "__main__":
main()
Выполнение этого дает вам (помните абзац!):
x, f = 3, lambda a: a + 1
Чтобы получить исходный код лямбды, лучше всего, по моему мнению, повторно проанализировать весь исходный файл (используя f.__code__.co_filename
) и сопоставить лямбда-узел AST по номеру строки и ее контексту.
Мы должны были сделать именно это в нашей библиотеке проектирования по контракту icontract , поскольку нам пришлось анализировать лямбда-функции, которые мы передаем в качестве аргументов декораторам. Здесь слишком много кода для вставки, поэтому взгляните на реализацию этой функции .