0

基本的に、関数またはクラスのコードをその定義の詳細 (パス、行、列) から取得するために jedi を使用したいと考えています。より明確にするために、私が本当に望んでいるのは、実行されていない静的なファイルからコードを取得することです。

4

3 に答える 3

0

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)
于 2016-03-29T13:24:03.573 に答える
0

これは現在、Jedi でサポートされているものではありません。確かにできますが、パブリック API ではできません。現在、Jedi の API に欠けているものが 2 つあります。

  1. 位置ごとにクラス/関数を取得します (これは、jedi のパーサーで遊ぶことで取得できます)。
  2. クラスを作成したら、コードを取得します。これはとても簡単です:node.get_code()

で遊んでみてくださいjedi.parser.Parser。これは非常に強力なツールですが、まだ公式に文書化されていません。

于 2016-04-29T13:39:57.000 に答える
0

このファイルhttps://github.com/Erotemic/utool/blob/next/utool/util_inspect.pyで定義されている関数 find_pyfunc_above_row を使用して、同様のタスクを実行します。

于 2016-03-02T13:56:09.607 に答える