Python 从知道行和列的文件中获取函数/类代码';s定义

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"):

基本上,我想使用jedi从函数或类的定义细节(路径、行、列)中检索函数或类的代码。更明确地说,我真正希望的是从一个未执行的静态文件中获取代码。

我使用此文件中定义的行上方的函数find_pyfunc_来完成类似的任务

您似乎可以使用
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目前缺少两件事:

  • 按位置获取类/函数(您可以通过使用jedi的解析器获得)
  • 一旦你有了你的类,就可以得到代码。这很简单:
    node.get\u code()

  • 尝试玩
    jedi.parser.parser
    。这是一个非常强大的工具,但尚未公开记录。

    很好。那就继续吧。@DanielRoseman我非常感谢你愿意抽出一点时间来帮助我。
    find_pyfunc_上面的行
    获取函数名,而对于
    get_func_sourcecode
    我需要一个活动函数,我想要一个静态代码函数检索,没有任何活动代码。
    utool
    提供了这样的功能,还是我遗漏了什么?不,我不认为你遗漏了什么。我认为这个函数比它做的更多。utool的大部分检查功能都使用实时代码对象。但是,您可以使用ast的解析树在您知道函数所在的行之后解析文件,然后从visit_FunctionDef获取代码。看看同一文件中的find_child_kwarg_funcs,它进行静态分析。你可以从解析树中获取源代码。多亏@Erotemic建议
    ast
    ,他实际上给了我解决方案。