Как я могу получить исходный код функции Python? - PullRequest
334 голосов
/ 09 января 2009

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

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

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

Ответы [ 13 ]

1 голос
/ 19 апреля 2019

Поскольку этот пост помечен как дубликат этого другого поста , я отвечу здесь за случай "лямбды", хотя ОП не касается лямбд.

Таким образом, для лямбда-функций, которые не определены в своих собственных строках: в дополнение к ответу marko.ristin вы можете использовать mini-lambda или использовать SymPy как предложено в этом ответе .

  • mini-lambda легче и поддерживает любые операции, но работает только для одной переменной
  • SymPy тяжелее, но гораздо больше оснащено математическими / вычислительными операциями. В частности, это может упростить ваши выражения. Он также поддерживает несколько переменных в одном выражении.

Вот как вы можете сделать это, используя mini-lambda:

from mini_lambda import x, is_mini_lambda_expr
import inspect

def get_source_code_str(f):
    if is_mini_lambda_expr(f):
        return f.to_string()
    else:
        return inspect.getsource(f)

# test it

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

print(get_source_code_str(foo))
print(get_source_code_str(x ** 2))

Это правильно дает

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

x ** 2

Подробнее см. mini-lambda документация . Я, кстати, автор;)

0 голосов
/ 14 апреля 2019

Если вы используете IPython, другой вариант - использовать ?? после имени функции, чтобы увидеть ее исходный код. Вот пример:

[nav] In [1]: def foo(arg1,arg2):
         ...:     #do something with args
         ...:     a = arg1 + arg2
         ...:     return a

[nav] In [2]: foo??
Signature: foo(arg1, arg2)
Docstring: <no docstring>
Source:
def foo(arg1,arg2):
    #do something with args
    a = arg1 + arg2
    return a
0 голосов
/ 09 января 2009

I считаю , что имена переменных не хранятся в файлах pyc / pyd / pyo, поэтому вы не можете получить точные строки кода, если у вас нет исходных файлов.

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