Как распечатать имена вложенных функций?

Например, у нас есть это:

def function_one():
    print("Function one")
    def function_two():
        print("Function two")
        def function_three():
            print("Function three")

И нам нужно это увидеть:

(function_one, function_two, function_three)

Я попробовал использовать библиотеку, но она показывает только первый уровень функций.

Внутренние операторы print вызываются не путем определения функции, а путем ее выполнения. Итак, внутри function_one должна быть линия из function_two() и function_three(). Однако при этом будут напечатаны отдельные строки, чтобы напечатать их, взгляните на параметр end параметра print.

Jan_B 15.05.2024 15:12

AST содержит всю необходимую информацию. Что именно вы пробовали?

chepner 15.05.2024 15:14

Также взгляните на этот вопрос

Jan_B 15.05.2024 15:17

Запрошенный вывод OP не связан с тем, что функции будут выводить при вызове.

chepner 15.05.2024 15:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Взял ответ из этого примера:

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)

Другие вопросы по теме