Как реализовать препроцессор для кода на Python ⇐ Python

Программы на Python
Anonymous
Как реализовать препроцессор для кода на Python

Сообщение Anonymous »

У меня есть код, который я хочу просканировать построчно. Проблема в том, что в коде операторы располагаются в несколько строк, например
def UART(ONE):
ONE = UUUU001 + 4
print(ONE)

Мне хотелось бы иметь инструмент, который сканировал бы код и подготавливал бы его к работе, извлекал бы имена, вызовы, параметры и т. д. У меня есть подсказка, которой можно воспользоваться. ast, но у меня такое впечатление, что я не очень хорошо понимаю ast
Например, я создал класс MyVisitor, который должен выполнять часть предварительной обработки, но я не могу получить правильные операторы из кода, поскольку «If», определения функций, циклы For не посещаются рекурсивно и поэтому отображаются как в строке (показано в выходных данных). (С другой стороны, вызовы функций собираются в один оператор). Так чего же мне не хватает?

class MyVisitor(ast.NodeVisitor):
def __init__(self):
self.konvertiert = []
def generic_visit(self, node):
if isinstance(node, ast.Constant):
pass
elif isinstance(node, ast.Store):
pass
elif isinstance(node, ast.Load):
pass
elif isinstance(node, ast.Name):
pass
elif isinstance(node, ast.Attribute):
pass
elif isinstance(node, ast.Assign):
self.konvertiert.append(ast.unparse(node))
elif isinstance(node, ast.BinOp):
pass
elif isinstance(node, ast.If):
self.konvertiert.append(ast.unparse(node))
#super().generic_visit(node)
elif isinstance(node, ast.Call):
self.konvertiert.append(ast.unparse(node))
#super().generic_visit(node)
elif isinstance(node, ast.FunctionDef):
self.konvertiert.append(ast.unparse(node))
#super().generic_visit(node)
else:
super().generic_visit(node)

code = '''
ONE = 7
if ONE==7:
print('Found one')
open(file, line)
foo = abrakdabra(15, 5,
16, 67,
eins, 99)
result = get_nummer(142, 141, 140) # 10
def UART(ONE): # 11
ONE = UUUU001 + 4
print(ONE)
WWWWWWWW(eins, 32, irgendwas, 'a[6]') # 12
name2 = 'Elise' # 13
'''

tree = ast.parse(code)
vis = MyVisitor()
vis.konvertiert = []
vis.visit(tree)

lauf = 0
for i in vis.konvertiert:
lauf += 1
print(f'{lauf}: {i}')


Выход:
1: ONE = 7
2: if ONE == 7:
print('Found one')
3: open(file, line)
4: foo = abrakdabra(15, 5, 16, 67, eins, 99)
5: result = get_nummer(142, 141, 140)
6: def UART(ONE):
ONE = UUUU001 + 4
print(ONE)
7: WWWWWWWW(eins, 32, irgendwas, 'a[6]')
8: name2 = 'Elise'


Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python

Вернуться в «Python»