完美解決Pytorch在Pycharm沒有代碼提示的問題

在Pytorch的舊版本中,沒有__init__.pyi這個文件(Pycharm就從__init__.pyi讀取函數的聲明以及參數類型),因此在Pycharm中torch.sum、torch.abs等函數就沒有代碼提示。沒有代碼提示很不方便,經過一番折騰,完美地解決了Pytorch在Pycharm中沒有代碼提示的問題。

  • 把Pytorch的版本升級到1.0.1.post2。

torch.sum、torch.abs等函數應該是有提示了,但是torch.nn、torch.optim等卻沒有提示了。解決方案如下:

  • 升級Pycharm到版本2019.1.1。

  • site-packages/torch/__init__.pyi中增加兩行代碼。
    舊的__init__.pyi

    from typing import Tuple, Optional, Union
    import pickle
    
    class Tensor:
        def abs(self, *, out: Optional['Tensor']=None) -> 'Tensor': ...
        ...
    

    新的__init__.pyi

    from typing import Tuple, Optional, Union
    import pickle
    from torch import nn, cuda, ops, functional, optim, autograd, onnx, utils
    from torch import contrib, distributions, for_onnx, jit, multiprocessing
    
    class Tensor:
        def abs(self, *, out: Optional['Tensor']=None) -> 'Tensor': ...
    	...
    

又遇到了“class Tensor does not define __sub__, so the ‘-’ cannot be used in its instances”這樣的錯誤,翻譯過來就是Tensor類沒有定義__sub__, ‘-’ 就不能用在實例之間。同樣的還有加減乘除符號都有類似的提示。於是繼續修改__init__.pyi
舊的Tensor定義:

class Tensor:
    def abs(self, *, out: Optional['Tensor']=None) -> 'Tensor': ...
   	...

新的Tensor定義:

class Tensor:
    def __add__(self, other, out):
        return self.add(other, out)

    def __sub__(self, other, out):
        return self.sub(other, out)

    def __mul__(self, other, out):
        return self.mul(other, out)

    def __truediv__(self, other, out):
        return self.div(other, out)

    def size(self) -> 'Size': ...

    def __getitem__(self, item): ...

    def __setitem__(self, key, value): ...

    def abs(self, *, out: Optional['Tensor']=None) -> 'Tensor': ...
    ...

就把加減乘除還有Tensor.size()函數都給它添加上了。說了這麼多,其實就是缺啥定義就在__init__.pyi補啥定義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章