Зауважте, що прийняті відповіді працюють лише в тому випадку, якщо лямбда надається в окремому рядку. Якщо ви передаєте це як аргумент функції і хочете отримати код лямбда як об'єкт, проблема стає трохи хитрою, оскільки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 лямбда за номером рядка та його контекстом.
Ми повинні були зробити це саме в нашій іконтрактній програмі бібліотеки за контрактом, оскільки нам довелося проаналізувати функції лямбда, які ми передаємо як аргументи декораторам. Тут занадто багато коду для вставки, тому подивіться на реалізацію цієї функції .