【问题标题】:How to analyze python code *within python* to identify variable names, function calls etc如何在 python* 内分析 python 代码以识别变量名、函数调用等
【发布时间】:2019-08-02 09:53:18
【问题描述】:

我正在尝试分析不完整 python 代码的 sn-ps(来自 github diffs),并且我想解析特定标记是否是 python 语言的元素(例如“if”或“+”或“def”) , 如果它是一个函数调用(如“initialize()”),或者它是一个变量名。

代码以字符串形式提供。

我已经看过 python 标记器 (https://docs.python.org/3/library/tokenize.html),它很有帮助,因为它可以区分 cmets、字符串、名称和操作。但此工具会将“def”和“print”识别为 NAME,就像它识别“my_function()”或“counter”或任何其他变量或函数名称一样。

我想区分被解析为变量的事物和被解析为函数的事物。

我也看过 eval 和 exec,但我不想执行我的代码,我只想逐个令牌地遍历它,找出令牌是什么类型的 python 语言元素。

有什么办法吗?

【问题讨论】:

  • 您无法区分printmy_function,因为它们实际上只是名称。 def 不同,因为它是一个关键字。
  • 我也查看了 AST 模块,但似乎这不适用于未形成完整有效代码块的不完整 sn-ps 代码?
  • 是的,它不会让您将输出映射到令牌。

标签: python python-3.x parsing


【解决方案1】:

您可以使用keyword模块来区分关键字和标识符:

import keyword

def is_keyword(name):
    return name in keyword.kwlist

print 这样的内置标识符和其他标识符一样,您可以覆盖它们等。如果您仍想区别对待它们,可以检查名称是否在builtins 模块中:

import builtins

def is_builtin(name):
    return name in builtins.__dict__

【讨论】:

  • 这太棒了,已经帮了我很多忙!非常感谢您的快速回复!
猜你喜欢
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2016-03-01
相关资源
最近更新 更多