Skip to main content
 首页 » 编程设计

python之Jedi 没有找到项目中的所有用法

2024年10月01日5zengkefu

我在 vim 中通过 YCM 使用 jedi,在我的项目中看到一些奇怪的行为,关于在 jediHttp 服务器上使用 usages 端点。基本上它只能找到我项目中类或函数的一小部分用法。它确实找到了当前文件中的所有用法,但没有找到其他文件中的绝大多数。 GoTo 命令工作正常,将按预期在项目中的任何位置打开一个新缓冲区。但是,当我从定义开始并尝试通过 GoToReferences 命令查看所有 usages 时,它只产生了大约 20% 的实际用法。

我尝试制作一个虚拟项目来重现行为,它似乎奏效了。这是简单的项目结构:

> tree -I __pycache__ 
. 
├── setup.py 
└── test_jedi 
    ├── classes.py 
    ├── __init__.py 
    ├── mod1 
    │   ├── __init__.py 
    │   └── recessed.py 
    └── script.py 
 
2 directories, 6 files 

这些文件的内容如下:

类.py

class Foo: 
    def __init__(self, a): 
        self.a = a 
 
    def make_a(self): 
        print('hello') 

mod1/recessed.py:

from test_jedi.classes import Foo 
 
Foo(5).make_a() 
print('Ran this') 

脚本.py:

from classes import Foo 
a = Foo(5) 
a.make_a() 

现在,在缓冲区中带有 recessed.py 的 vim 中,我可以在 Foo 上使用 GoTo 立即打开 classes.py缓冲。然后,当我从 classes.py 缓冲区尝试 GoToReferences 时,我只在 script.py类.py。我不知道为什么 jedi 没有向我显示 recessed.py

中的用法

这是显示的 quickfix 缓冲区:

classes.py|2 col 7| class Foo 
script.py|2 col 21| from classes import Foo 
script.py|5 col 5| a = Foo(5) 

但显然没有引用 mod1/recessed.py,它显然使用了 Foo

有什么想法吗?

请您参考如下方法:

我知道这个问题已有 1.5 年历史了,但为了像我一样遇到这个问题的人,它与 Jedi 中当前 Unresolved 问题有关。

Jedi script.usages 由 YouCompleteMe 在其 GoToReferences 函数中使用。然而,根据作者的说法,script.usages 在很多地方都有错误。他非常清楚这个问题,但目前它的优先级较低。

Link to the issue