如果我尝试编译一些错误的python代码:
bad_code = """
r
"""
import compiler
print compiler.parse(bad_code)
我得到了
Module(None, Stmt([Discard(Name('r'))]))
我是否可以一直认为如果我在树中看到Discard,那么代码是坏的? 还是更微妙?
答案 0 :(得分:1)
不,为任何未使用结果的表达式生成Discard:
>>> compiler.parse("1")
Module(None, Stmt([Discard(Const(1))]))
>>> compiler.parse("def x(): yield 1")
Module(None, Stmt([Function(None, 'x', (), (), 0, None, Stmt([Discard(Yield(Const(1)))]))]))
例如,InteractiveCodeGenerator
为丢弃节点发出PRINT_EXPR
,而正常CodeGenerator
只发出POP_TOP
个结果。
你的“坏代码”在语法方面也不错。错误代码会为您提供SyntaxError
。