Получить код функции / класса из файла, зная строку и столбец его определения
По сути, я хочу использовать 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 отсутствует.
- Получение класса / функции по позиции (Вы можете получить это, играя в Parser Джедая).
- Получение кода, когда у вас есть класс. Это очень просто:
node.get_code()
Попробуйте поиграть с jedi.parser.Parser
, Это довольно мощный инструмент, но еще не публично документирован.
Я использую функцию find_pyfunc_above_row, определенную в этом файле https://github.com/Erotemic/utool/blob/next/utool/util_inspect.py чтобы выполнить аналогичную задачу.