Ответ 1
inspect.getsource
Похоже, что источник источника не может получить исходный код лямбда.
Скажем, я работаю в оболочке Python, и мне предоставляется функция f
. Как я могу получить доступ к строке, содержащей ее исходный код? (Из оболочки, а не путем ручного открытия файла кода.)
Я хочу, чтобы это работало даже для лямбда-функций, определенных внутри других функций.
inspect.getsource
Похоже, что источник источника не может получить исходный код лямбда.
Не обязательно то, что вы ищете, но в ipython вы можете сделать:
>>> function_name??
и вы получите источник кода функции (только если он в файле). Так что это не сработает для лямбды. Но это определенно полезно!
возможно, это может помочь (может получить также лямбда, но это очень просто),
import linecache
def get_source(f):
source = []
first_line_num = f.func_code.co_firstlineno
source_file = f.func_code.co_filename
source.append(linecache.getline(source_file, first_line_num))
source.append(linecache.getline(source_file, first_line_num + 1))
i = 2
# Here i just look until i don't find any indentation (simple processing).
while source[-1].startswith(' '):
source.append(linecache.getline(source_file, first_line_num + i))
i += 1
return "\n".join(source[:-1])
Функциональный объект содержит только скомпилированный байт-код, исходный текст не сохраняется. Единственный способ получить исходный код - прочитать файл script, из которого он пришел.
В lambdas нет ничего особенного: у них все еще есть свойство f.func_code.co_firstline
и co_filename
, которое вы можете использовать для извлечения исходного файла, если лямбда определена в файле, а не интерактивный.