Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PyTorch specific inspection issues in PyCharm

Has anyone been able to resolve PyTorch specific inspection issues in PyCharm? Previous posts for non-PyTorch related issues suggest upgrading PyCharm, but I'm currently at the latest version. One option is to of course disable certain inspections entirely, but I'd rather avoid that.

Example: torch.LongTensor(x) gives me "Unexpected argument...", whereas both call signatures (with and without x) are both supported.

like image 346
rd11 Avatar asked Jun 13 '17 13:06

rd11


1 Answers

I believe it's because torch.LongTensor has no __init__ method for pycharm to find.

According to this source that I found thanks to this SO post :

Use __new__ when you need to control the creation of a new instance. Use __init__ when you need to control initialization of a new instance.

__new__ is the first step of instance creation. It's called first, and is responsible for returning a new instance of your class. In contrast, __init__ doesn't return anything; it's only responsible for initializing the instance after it's been created.

In general, you shouldn't need to override __new__ unless you're subclassing an immutable type like str, int, unicode or tuple.

Since Tensors are types, it makes sense to define only new and no init.

You can experiment this behavior by testing the following classes :

torch.LongTensor(1)  # Unexpected arguments

Produces the warning while the following doesn't.

class MyLongTensor(torch.LongTensor):
    def __init__(self, *args, **kwargs):
        pass

MyLongTensor(1)  # No error

To confirm that the absence of __init__ is the culprit try :

class Example(object):
    pass

Example(0)  # Unexpected arguments

To find out by yourself, use pycharm to Ctrl+click on LongTensor then _TensorBase and look at the defined methods.

like image 122
Victor T Avatar answered Nov 10 '22 09:11

Victor T