Например, у нас есть это:
def function_one():
print("Function one")
def function_two():
print("Function two")
def function_three():
print("Function three")
И нам нужно это увидеть:
(function_one, function_two, function_three)
Я попробовал использовать библиотеку, но она показывает только первый уровень функций.
AST содержит всю необходимую информацию. Что именно вы пробовали?
Также взгляните на этот вопрос
Запрошенный вывод OP не связан с тем, что функции будут выводить при вызове.






Взял ответ из этого примера:
import ast, inspect
# this is the test scenario
def function1():
f1_var1 = 42
def function2():
f2_var1 = 42
f2_var2 = 42
def function3():
f3_var1 = 42
# derive source code for top-level function
src = inspect.getsource(function1)
# derive abstract syntax tree rooted at top-level function
node = ast.parse(src)
# next, ast's walk method takes all the difficulty out of tree-traversal for us
for x in ast.walk(node):
# functions have names whereas variables have ids,
# nested-classes may all use different terminology
# you'll have to look at the various node-types to
# get this part exactly right
name_or_id = getattr(x,'name', getattr(x,'id',None))
if name_or_id:
print name_or_id
Ответ:
function1
function2
f1_var1
function3
f2_var1
f2_var2
f3_var1
Спасибо!
Ваш ответ можно улучшить, добавив дополнительную вспомогательную информацию. Пожалуйста, отредактируйте , добавив дополнительную информацию, например цитаты или документацию, чтобы другие могли подтвердить правильность вашего ответа. Более подробную информацию о том, как писать хорошие ответы, вы можете найти в справочном центре.
Используя функциональность, предоставляемую модулем ast, мы можем получить требуемый результат следующим образом:
from ast import parse, walk, FunctionDef
from inspect import getsource
def function_one():
print("Function one")
def function_two():
print("Function two")
def function_three():
print("Function three")
def getfuncs(func):
for n in walk(parse(getsource(func))):
if isinstance(n, FunctionDef):
yield n.name
print("(" + ", ".join(getfuncs(function_one)) + ")")
Выход:
(function_one, function_two, function_three)
Внутренние операторы
printвызываются не путем определения функции, а путем ее выполнения. Итак, внутриfunction_oneдолжна быть линия изfunction_two()иfunction_three(). Однако при этом будут напечатаны отдельные строки, чтобы напечатать их, взгляните на параметрendпараметраprint.