Не удается получить исходный код из оцененной лямбда-функции - PullRequest
0 голосов
/ 08 мая 2020

Я наткнулся на этот интересный факт, и мне интересно, как его преодолеть. Используя inspect, легко получить исходный код лямбды. Но как только вы вернете ту же лямбду из оператора eval, функция get source завершится ошибкой.

import inspect

f = lambda a: a*2
f2 = eval("lambda a: a*2")

inspect.getsource(f), inspect.getsource(f2)


/usr/lib/python3.7/inspect.py in getsource(object)
    971     or code object.  The source code is returned as a single string.  An
    972     OSError is raised if the source code cannot be retrieved."""
--> 973     lines, lnum = getsourcelines(object)
    974     return ''.join(lines)
    975 

/usr/lib/python3.7/inspect.py in getsourcelines(object)
    953     raised if the source code cannot be retrieved."""
    954     object = unwrap(object)
--> 955     lines, lnum = findsource(object)
    956 
    957     if istraceback(object):

/usr/lib/python3.7/inspect.py in findsource(object)
    784         lines = linecache.getlines(file)
    785     if not lines:
--> 786         raise OSError('could not get source code')
    787 
    788     if ismodule(object):

OSError: could not get source code

Есть ли способ преодолеть это и получить исходный код оцененного кода?

1 Ответ

0 голосов
/ 09 мая 2020

Функции не запоминают свой исходный код - все, что они знают, - это имя файла и номера строк, из которых они произошли. Если определения функции не было в физическом файле, который все еще доступен, тогда работа inspect.getsource () совершенно невозможна. Вместо этого вам понадобится декомпилятор.

thx, jasonharper

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...