如何阻止`ast.parse`将数值转换为int / floats?

时间:2013-10-17 20:04:29

标签: python parsing abstract-syntax-tree concrete-syntax-tree multiprecision

例如::

>>> import ast
>>> print(type(ast.parse('1.2', mode='eval').body.n)
float

如何让解析器将python源文件转换为语法树,同时保留str类型中节点的原始值?因为我需要使用尽可能精确的分数将例如'1.2'转换为精确值,而不会丢失任何精度(值1.2不能以浮点格式精确表示)。

我希望在不重新实现解析器的情况下这样做。也许还有其他解析器比ast模块更适合这个。

顺便说一下,我不仅需要解析表达式而且要解析程序。

2 个答案:

答案 0 :(得分:0)

我所知道的最先进的AST工具是前astng项目,它备份了pylint以及来自logilab的类似工具。现在它被称为Astroid并且可以从https://bitbucket.org/logilab/astroid/获得。如果它没有帮助,那么可能什么都不会。

答案 1 :(得分:0)

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'