在python中丢弃指示代码是不是很糟糕?

时间:2014-03-03 23:59:50

标签: python compilation abstract-syntax-tree

如果我尝试编译一些错误的python代码:

bad_code = """
r
"""

import compiler
print compiler.parse(bad_code)

我得到了

Module(None, Stmt([Discard(Name('r'))]))

我是否可以一直认为如果我在树中看到Discard,那么代码是坏的? 还是更微妙?

1 个答案:

答案 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