IndentationError во время `ast.parse` и` ast.walk` функции, которая является методом внутри класса - PullRequest
0 голосов
/ 06 июня 2019

Я думаю, что я знаю об обычных причинах IndentationError, как описано в IndentationError: unindent не соответствует ни одному внешнему уровню отступа , например. Это не применимо здесь.

Кроме того, я знаю о textwrap.dedent, но мне не кажется, что это правильный подход?


Если у меня есть «обычная» функция, я могу сделать ast.parse и ast.walk следующим образом:

import ast
import inspect

def a():
    pass

code = inspect.getsource(a)
nodes = ast.walk(ast.parse(code))
for node in nodes:
    ...

Однако, если функция является методом внутри класса, например:

class B:
    def c(self):
        pass

code = inspect.getsource(B.c)
nodes = ast.walk(ast.parse(code))

Я получаю:

IndentationError: unexpected indent

Думаю, это имеет смысл, поскольку B.c имеет с отступом на один уровень. Так как же мне ast.parse и ast.walk здесь вместо этого?

1 Ответ

3 голосов
/ 06 июня 2019

Это потому, что вы схватили метод, а не пытались пройтись без удаления отступов.Ваш класс:

class B:
    def c(self):
        pass

code = inspect.getsource(B.c)
nodes = ast.walk(ast.parse(code))

Если вы напечатаете code, вы увидите:

    def c(self):
        pass

Примечание: Приведенный выше код имеет один отступ.Вам нужно отменить отступ:

import inspect
import ast
import textwrap
class B:
    def c(self):
        pass
code = textwrap.dedent(inspect.getsource(B.c))
nodes = ast.walk(ast.parse(code))
...