如何解析Python代码同时保持字符串原样不变?

时间:2019-05-28 04:35:35

标签: python parsing abstract-syntax-tree literals string-length

我试图遍历Python源代码中的所有字符串文字,同时能够分辨出每种字符串文字是什么类型。

不幸的是,如您在本例中所见,ast.parse不起作用:

[node.value.s for node in ast.parse('\'x\'; u\'x\'; b\'x\'; "x"; u"x"; b"x"').body]

输出为:

['x', 'x', b'x', 'x', 'x', b'x']

表示我无法区分''u''文字,还是''""等。

我如何解析Python源代码,同时又保持原始文字的原样?

有内置的方法吗?

1 个答案:

答案 0 :(得分:3)

您要查找的信息不是AST级信息。检验像这样的东西的适当级别是令牌级别,您可以为此使用tokenize模块。

GMail API非常笨拙-它希望输入的行为类似于类似二进制文件的对象的tokenize方法-因此,您需要以二进制模式打开文件,如果您有一个字符串,则需要使用readlineencode进行转换。

io.BytesIO

这是Python 2版本-函数名称不同,由于必须使用常规元组而不是namedtuple,因此必须在位置上访问令牌信息:

import tokenize
token_stream = tokenize.tokenize(input_file.readline)
for token in token_stream:
    if token.type == tokenize.STRING:
        do_whatever_with(token.string)