完美解决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补啥定义。

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