mea*_*mea 2 python syntax-error
我正在开发一个工具,它必须接受一个文件作为输入,检查语法错误,编译它并在那之后做一些事情.
例如,我有一个文件run.py:
a=5
b=c
print b
Run Code Online (Sandbox Code Playgroud)
这应该在编译时清楚地显示语法错误,因为未定义'c'
我试着用
try:
py_compile.compile("source_program/run.py", doraise=True)
print "Compiled"
except:
print "Error while compiling"
Run Code Online (Sandbox Code Playgroud)
我得到输出"Compiled"而不是"编译时出错"
如果我将run.py文件修改为:
a=5
b=c/ #Instead of b=c
print b
Run Code Online (Sandbox Code Playgroud)
然后我得到输出"编译时出错"
在第一种情况下,我什么不收到错误消息?
这不是语法错误.b=c是完全有效的语法,无论是否c存在.事实上,其他一些模块本可以做到
import __builtin__
__builtin__.c = 3
Run Code Online (Sandbox Code Playgroud)
在这种情况下c,所有模块都有一个值为3 的内置变量,您的代码运行正常.
对于一个稍微不那么病态的例子,如果文件包含*诸如的导入
from numpy import *
Run Code Online (Sandbox Code Playgroud)
导入会将一大堆名称转储到模块的全局命名空间中,并且无法分辨出这些名称是什么.但即使没有import *,Python也无法确定在编译时对未知名称的引用是错误的.
如果要检测此类语义错误,则需要对程序进行更复杂的分析.如pylintNPE所建议的那样,与现有的linter集成,可能比编写自己的工具更有效率.如果你真的想自己做,你可以解析代码ast.parse并检查AST,逐个语句来查看哪些变量存在于哪些点.你仍然永远不会捕获所有的bug,但你会发现很多.
| 归档时间: |
|
| 查看次数: |
2610 次 |
| 最近记录: |