3 回答

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
我們有類似的需求,為此我創(chuàng)建了asttokens庫(kù)。它以文本和標(biāo)記化形式維護(hù)源,并用標(biāo)記信息標(biāo)記AST節(jié)點(diǎn),從中也可以輕松獲得文本。
它適用于Python 2和3(經(jīng)過(guò)2.7和3.5測(cè)試)。例如:
import ast, asttokens
st='''
def greet(a):
say("hello") if a else say("bye")
'''
atok = asttokens.ASTTokens(st, parse=True)
for node in ast.walk(atok.tree):
if hasattr(node, 'lineno'):
print atok.get_text_range(node), node.__class__.__name__, atok.get_text(node)
印刷
(1, 50) FunctionDef def greet(a):
say("hello") if a else say("bye")
(17, 50) Expr say("hello") if a else say("bye")
(11, 12) Name a
(17, 50) IfExp say("hello") if a else say("bye")
(33, 34) Name a
(17, 29) Call say("hello")
(40, 50) Call say("bye")
(17, 20) Name say
(21, 28) Str "hello"
(40, 43) Name say
(44, 49) Str "bye"

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊
ast.get_source_segment 是在python 3.8中添加的:
import ast
code = """
if 1 == 1 and 2 == 2 and 3 == 3:
test = 1
"""
node = ast.parse(code)
ast.get_source_segment(code, node.body[0])
產(chǎn)生: if 1 == 1 and 2 == 2 and 3 == 3:\n test = 1
添加回答
舉報(bào)