Как остановить `ast.parse` от преобразования числовых значений в int/float?
Например::
>>> import ast
>>> print(type(ast.parse('1.2', mode='eval').body.n)
float
Как мне позволить парсеру конвертировать исходный файл python в синтаксическое дерево, сохраняя при этом исходные значения узлов в str
тип? Потому что мне нужно преобразовать, например, '1.2' в точные значения, используя дроби настолько точно, насколько это возможно, без потери точности вообще (значение 1.2 не может быть точно представлено в формате с плавающей запятой).
Предпочтительно я хочу сделать это без переопределения парсера. Возможно, есть другие парсеры, более подходящие для этого, чем ast
модуль.
Кстати, мне нужно разобрать не только выражения, но и программы.
1 ответ
Самый продвинутый инструмент для работы с AST, о котором я знаю, это первый astng
проект, который поддержал pylint
и аналогичные инструменты от logilab. Теперь это называется Astroid
и доступно по https://bitbucket.org/logilab/astroid/ Если это не поможет, то, вероятно, ничего не поделаешь.
LibCST - это синтаксический анализатор дерева Python с конкретным синтаксисом и набор инструментов, который можно использовать для решения вашей проблемы. Он предоставляет синтаксическое дерево, которое выглядит как ast, и сохраняет плавающий формат как строку. https://github.com/Instagram/LibCST/
https://libcst.readthedocs.io/en/latest/index.html
Вот некоторые примеры:
In [1]: import libcst as cst
In [2]: cst.parse_expression("1.2")
Out[2]:
Float(
value='1.2',
lpar=[],
rpar=[],
)
In [3]: cst.parse_expression("1.2").value
Out[3]: '1.2'
In [4]: cst.parse_expression("5e-2").value
Out[4]: '5e-2'