vscode python 代码补全 慢_关于VS Code中python的智障补全的解决方案,以pytorch为例...

VS code有两种补全方案:Jedi和python.language.server。这两种方案对pytroch的补全都有些智障,Jedi对pytorch中C方法(比如torch.cat,torch.transpose等。应该在_C中?)没有任何提示,但对package有效。而python.language.server能够提示C方法,但对package的提示却有些智障。下面给出一些解决建议,一些结论属于推测,说错了希望各位大佬轻喷。

1 关于Jedi的智障:无法补全torch.cat使用Jedi补全的话,勾上这个

关于解决自动补全,可以看一下这个,解决Pytorch在IDE中无法自动补全的问题。里面提到了pyi文件,pyi文件是一个type hints文件,这个文件只在type checker的时候使用,帮助我们在edit时进行提示,但在代码运行时,这个文件会被忽略。可以打开~\site-packages\torch文件夹,里面有一个__init__.pyi文件,里面定义了各种方法,并使用python3的type hint特性进行类型提示,如下图

在写代码时,__init__.pyi中的方法定义代替了_C文件里的方法定义,也就是说,写代码时补全工具使用__init__.pyi进行代码提示,代码运行时pyi会被忽略,使用_C文件中的方法。

那么,有了__init__.pyi对cat的定义,jedi为啥无法补全torch.cat呢?原因很简单,因为Jedi不支持pyi(应该是这样,pylint也不支持,所以使用pylint检查代码的话会报错)。

解决方案:如果实在想用jedi的话(ps: python.language.server每次加载那么长时间简直蛋疼),那么可以在torch目录下创建一个文件xxx.py,把__init__.pyi中的内容复制进去,然后在__init__.py中加入一行:if False: from . import xxx,这样能达到与pyi同样的效果(在编辑时能加载模块,运行时不执行),但是,类型信息小面板上是空白,不过输入(后就能出现参数信息了。

2 关于python.language.server的智障:无法补全torch.cuda使用python.language.server补全

python.language.server支持pyi,所以能够补全torch.cat,但它的问题在于无法补全package。使用import torch; torch.cuda,cuda部分无法出现提示,而http://torch.cuda.xxx也一样;但是如果使用import torch; import torch.cuda;torch.cuda和http://torch.cuda.xxx却可以出现提示。

那么,为什么只使用import cuda,torch.cuda无法出现提示呢?

我个人推测,jedi应该会去检索目录及init.py,所以torch目录下有cuda包,jedi可以进行import(当然,不支持pyi)。而python.language.server不会去检索目录,只会去查看__init__.py和__init__.pyi文件中的import部分和各种定义,据此加载模块,但是目录中有什么它并不知道。python的包导入是一个动态导入过程,在自己的文件中输入import torch后,python.language.server会去查看torch下的__init__.py和__init__.pyi中的内容,如果__init__.py中没有import torch.cuda这一行,那么cuda包就不会被加载。这也就解释了为什么加入from torch import cuda或者import torch.cuda后可以对torch.cuda进行补全。

但是,,看一下torch文件夹下的__init__.py文件里

奇怪的是,明明就有import torch.cuda这句话(可以试一下,torch.autograd也不能提示)。原因就在于python.language.server是使用相对路径加载模块的。回忆一下你的自定义package,package下有一个test.py文件和a.py文件,如果想要在test.py中导入a,应该使用from . import a 还是使用from package import a呢?所以,根据import torch.cuda这句话,python.language.server无法加载torch下的cuda模块(自定义文件中可以加载),改成from . import cuda就可以。(ps1:为什么改成import cuda不行呢?ps2:可以看一下numpy的_init_.py,里面使用的就是from . import)所以下面这一部分就需要改一下

import torch.cuda 改为from . import cuda,其他的依次类推。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值