Получить код функции / класса из файла, зная строку и столбец его определения

По сути, я хочу использовать jedi для получения кода функции или класса из деталей его определения (пути, строки, столбца). Чтобы быть более точным, я действительно хочу получить код из файла, который не выполняется, статический.

3 ответа

Решение

Кажется, что вы можете использовать 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 отсутствует.

  1. Получение класса / функции по позиции (Вы можете получить это, играя в Parser Джедая).
  2. Получение кода, когда у вас есть класс. Это очень просто: node.get_code()

Попробуйте поиграть с jedi.parser.Parser, Это довольно мощный инструмент, но еще не публично документирован.

Я использую функцию find_pyfunc_above_row, определенную в этом файле https://github.com/Erotemic/utool/blob/next/utool/util_inspect.py чтобы выполнить аналогичную задачу.

Другие вопросы по тегам