天天看點

dev c++ 代碼補全_關于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

dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例

使用Jedi補全的話,勾上這個

關于解決自動補全,可以看一下這個,解決Pytorch在IDE中無法自動補全的問題。裡面提到了pyi檔案,pyi檔案是一個type hints檔案,這個檔案隻在type checker的時候使用,幫助我們在edit時進行提示,但在代碼運作時,這個檔案會被忽略。可以打開~site-packagestorch檔案夾,裡面有一個__init__.pyi檔案,裡面定義了各種方法,并使用python3的type hint特性進行類型提示,如下圖

dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例

在寫代碼時,__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同樣的效果(在編輯時能加載子產品,運作時不執行),但是,類型資訊小面闆上是空白,不過輸入(後就能出現參數資訊了。
dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例
dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例

2 關于python.language.server的智障:無法補全torch.cuda

dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例

使用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卻可以出現提示。

dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例
dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例

那麼,為什麼隻使用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檔案裡

dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例

奇怪的是,明明就有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)是以下面這一部分就需要改一下

dev c++ 代碼補全_關于VS Code中python的智障補全的解決方案,以pytorch為例
import torch.cuda 改為from . import cuda,其他的依次類推。

繼續閱讀