Как остановить `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'
Другие вопросы по тегам