【问题标题】:How to tell if a string contains valid Python code如何判断字符串是否包含有效的 Python 代码
【发布时间】:2012-08-04 23:40:07
【问题描述】:

如果我有一个 Python 代码字符串,我如何判断它是否有效,即,如果在 Python 提示符下输入,它会引发 SyntaxError 与否?我认为使用compiler.parse 会起作用,但显然该模块已在 Python 3 中删除。有没有办法在 Python 3 中也适用。显然,我不想执行代码,只需检查它语法。

【问题讨论】:

  • @goldenparrot 上次我检查时,gcc 没有 Python 前端,而且静态编译器通常在动态语言方面表现不佳,如果他们尝试过的话。
  • @delnan 正在等待 gcc-python
  • 您真的只是在寻找语法错误吗?或者还有逻辑错误(即 g==5 没有为 g 设置值)因为 g==5 将 ast.parse 即使没有 g 任何地方
  • @JoranBeasley 鉴于在一般情况下无法检测到此类错误,在许多其他情况下很难检测到研究级别,而且除了最微不足道的情况外,在所有情况下找到这些错误仍然非常昂贵,我希望不会为了他。
  • 我认为 pylint 会抓住它(在大多数情况下)...

标签: python syntax python-3.x


【解决方案1】:

使用ast.parse:

import ast
def is_valid_python(code):
   try:
       ast.parse(code)
   except SyntaxError:
       return False
   return True

>>> is_valid_python('1 // 2')
True
>>> is_valid_python('1 /// 2')
False

【讨论】:

  • 我删掉了除了。只要网站允许,我就会接受(不是双关语)这个答案。
  • 在裸 return 上失败。请改用@leoluk 的答案。
【解决方案2】:

编译器模块现在是built-in

compile(source, filename, mode[, flags[, dont_inherit]])

将源代码编译为代码或 AST 对象。代码对象可以是 由 exec 语句执行或通过调用 eval() 进行评估。资源 可以是字符串或 AST 对象。参考 ast 模块 有关如何使用 AST 对象的信息的文档。

AST 解析器现在是 seperate module

ast.parse(expr, filename='<unknown>', mode='exec')

将表达式解析为 AST 节点。相当于compile(expr, filename, mode, ast.PyCF_ONLY_AST)

【讨论】:

  • compile 以前存在过,并且没有完整的compiler 模块。 ast 更近了。
  • 但是compile 想要文件名等。我只想检查一个字符串,而不是读取或写入任何文件。
  • 只需将&lt;string&gt; 之类的内容作为文件名传递。链接文档中的完整详细信息。
  • 除此之外,compile 函数有一些怪癖(需要特定的换行符,并且当输入中有 NUL 字节时,无处引发 TypeError)其他选项没有有。
猜你喜欢
  • 2020-08-26
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2017-01-29
相关资源
最近更新 更多