Python 从知道行和列的文件中获取函数/类代码';s定义
基本上,我想使用jedi从函数或类的定义细节(路径、行、列)中检索函数或类的代码。更明确地说,我真正希望的是从一个未执行的静态文件中获取代码。我使用此文件中定义的行上方的函数find_pyfunc_来完成类似的任务 您似乎可以使用Python 从知道行和列的文件中获取函数/类代码';s定义,python,python-jedi,Python,Python Jedi,基本上,我想使用jedi从函数或类的定义细节(路径、行、列)中检索函数或类的代码。更明确地说,我真正希望的是从一个未执行的静态文件中获取代码。我使用此文件中定义的行上方的函数find_pyfunc_来完成类似的任务 您似乎可以使用ast和codegen来完成此任务 我将发布一个代码示例来说明这一点: import ast,codegen def find_by_line(root, line): found = None if hasattr(root, "lineno"):
ast
和codegen
来完成此任务
我将发布一个代码示例来说明这一点:
import ast,codegen
def find_by_line(root, line):
found = None
if hasattr(root, "lineno"):
if root.lineno == line:
return root
if hasattr(root, "body"):
for node in root.body:
found = find_by_line(node, line)
if found:
break
return found
def get_func_code(path, line):
with open(path) as file:
code_tree = ast.parse(file.read())
unit = find_by_line(code_tree, line)
return codegen.to_source(unit)
这在绝地武士中是不受支持的。您当然可以这样做,但不能使用公共API。绝地API目前缺少两件事:
node.get\u code()
尝试玩
jedi.parser.parser
。这是一个非常强大的工具,但尚未公开记录。很好。那就继续吧。@DanielRoseman我非常感谢你愿意抽出一点时间来帮助我。find_pyfunc_上面的行
获取函数名,而对于get_func_sourcecode
我需要一个活动函数,我想要一个静态代码函数检索,没有任何活动代码。utool
提供了这样的功能,还是我遗漏了什么?不,我不认为你遗漏了什么。我认为这个函数比它做的更多。utool的大部分检查功能都使用实时代码对象。但是,您可以使用ast的解析树在您知道函数所在的行之后解析文件,然后从visit_FunctionDef获取代码。看看同一文件中的find_child_kwarg_funcs,它进行静态分析。你可以从解析树中获取源代码。多亏@Erotemic建议ast
,他实际上给了我解决方案。