Как получить объекты рекурсивно, используя генератор Python? - PullRequest
1 голос
/ 03 июня 2019

Я пишу функцию генератора, которая рекурсивно проходит по всем дочерним узлам для данного узла астроида.

В приведенном ниже примере node является узлом астроида functiondef.node.getchildren() возвращает генератор с подузлами в узле.

Моя цель - получить каждый содержащийся узел.(даже в подузле)

def recursive_walk(node):
    try:
        for subnode in list(node.get_children()):
            # yield subnode
            print(subnode)
            recursive_walk(subnode)            

    except AttributeError:
        # yield node       
        print(node)

    except TypeError:
        # yield node  
        print(node)

Здесь, если я закомментировал заявление о доходности.Для оператора print я получаю желаемый результат, но если я выдаю узел, я не получаю желаемый вывод.

Для воспроизведения этого: - установите astroid

import astroid

node = astroid.extract_node('''
def test_function(something): #@
    """Test function for getting subnodes"""
    assign_line = "String"
    ctx = len(assign_line)
    if ctx > 0:
        if ctx == 1:
            return 1
        if ctx > 10:
            return "Ten"
    else:
        return 0
''')

Ответы [ 2 ]

1 голос
/ 03 июня 2019

Вы можете рекурсивно map использовать функцию потомков и использовать yield from:

def recursive_walk(node):
    # yield the base node
    yield node
    # for each of the recursive calls yield the remaining ones
    yield from map(recursive_walk, node.get_children())

Если у них нет потомков, это ничего не даст и продолжит работу со следующими.

0 голосов
/ 04 июня 2019
def recursive_walk(node):
    """
    Generator function to recursively walk through a given node.

    Yields every astroid node inside.
    """
    try:
        for subnode in list(node.get_children()):
            yield subnode
            yield from recursive_walk(subnode)

    except AttributeError:
        yield node

    except TypeError:
        yield node

Это делает работу.

...