Вопрос-Ответ

How can I get the source code of a Python function?

Как я могу получить исходный код функции Python?

Предположим, у меня есть функция Python, как определено ниже:

def foo(arg1,arg2):
#do something with args
a = arg1 + arg2
return a

Я могу получить имя функции с помощью foo.func_name. Как я могу программно получить ее исходный код, как я ввел выше?

Переведено автоматически
Ответ 1

Если функция взята из исходного файла, доступного в файловой системе, то inspect.getsource(foo) может помочь:

If foo определяется как:

def foo(arg1,arg2):         
#do something with args
a = arg1 + arg2
return a

Тогда:

import inspect
lines = inspect.getsource(foo)
print(lines)

ВОЗВРАТ:

def foo(arg1,arg2):         
#do something with args
a = arg1 + arg2
return a

Но я считаю, что если функция скомпилирована из строки, потока или импортирована из скомпилированного файла, то вы не сможете получить ее исходный код.

Ответ 2

В модуле inspect есть методы для извлечения исходного кода из объектов python. По-видимому, это работает, только если исходный код находится в файле. Если бы у вас это было, я думаю, вам не нужно было бы получать исходный код из объекта.


Следующие тесты inspect.getsource(foo) с использованием Python 3.6:

import inspect

def foo(arg1,arg2):
#do something with args
a = arg1 + arg2
return a

source_foo = inspect.getsource(foo) # foo is normal function
print(source_foo)

source_max = inspect.getsource(max) # max is a built-in function
print(source_max)

Сначала выводится:

def foo(arg1,arg2):
#do something with args
a = arg1 + arg2
return a

Затем происходит сбой на inspect.getsource(max) со следующей ошибкой:

TypeError: <built-in function max> is not a module, class, method, function, traceback, frame, or code object
Ответ 3

IPython

Примечание: этот ответ применим только к IPython и проектам, которые его используют, таким как Jupyter.

Просто используйте foo?? или ??foo.

Если вы используете IPython, то вам нужно ввести foo?? или ??foo, чтобы увидеть полный исходный код. Чтобы увидеть в функции только строку документации, используйте foo? или ?foo. Это работает и в Jupyter notebook.

In [19]: foo??
Signature: foo(arg1, arg2)
Source:
def foo(arg1,arg2):
#do something with args
a = arg1 + arg2
return a

File: ~/Desktop/<ipython-input-18-3174e3126506>
Type: function
Ответ 4

dis ваш друг, если исходный код недоступен:

>>> import dis
>>> def foo(arg1,arg2):
... #do something with args
... a = arg1 + arg2
... return a
...
>>> dis.dis(foo)
3 0 LOAD_FAST 0 (arg1)
3 LOAD_FAST 1 (arg2)
6 BINARY_ADD
7 STORE_FAST 2 (a)

4 10 LOAD_FAST 2 (a)
13 RETURN_VALUE
python function