如何在文档字符串中为PyCharm解析器指定类或函数类型

时间:2015-07-10 13:45:34

标签: python python-2.7 pycharm

我使用了很多Pycharm docstring类型解析器来指定方法参数和返回的类型,属性或实例变量。如果它几乎一直在工作,我有一个关于告诉PyCharm我有一个函数或一个类作为参数/属性/ ...的问题。

这是一个简短的例子:

class Bar:

    def __init__(self, bar):
        """
        :type bar: str
        """
        print bar

class Foo:
    """
    :type my_class: Bar.__class__
    """

    def __init__(self, cinstance=Bar):
        """
        :type cinstance: Bar.__class__
        """
        self.my_class = cinstance

    def run(self):
        # it should print an unexpected type warning, but it doesn't.
        self.my_class(2)

如果我只是放Bar而不是Bar.__class__,当然PyCharm告诉我Bar无法调用。那么如何告诉他我给他上课了?

请注意,使用@classmethod装饰器时,PyCharm没有任何问题可以理解我们是在谈论类而不是实例。

以下是我的尝试:

Attempt with <code>Bar.__name__</code>

Attempt with <code>Bar.__class__</code>

Attempt with <code>Bar</code>

4 个答案:

答案 0 :(得分:2)

PyCharm的支持告诉我以下内容:

  

正如PyCharm开发人员所说:你无法区分类型提示中的类和实例。类型提示中的类名称表示该类的实例是预期的。如果您的函数接受类本身,则您的选项要么根本不使用类型提示,要么使用&#39;类型&#39;作为班级名称。无论如何,在这些情况下,没有任何有用的代码完成。另请参阅https://youtrack.jetbrains.com/issue/PY-11615

规定参数的唯一方法是使用:type arg: type类,但完成工作不会很好。目前没有其他办法。

答案 1 :(得分:1)

如果要指定参数的类型为SomeClass,则应将其声明为:

@type (param): SomeClass

指定正确,你应该得到这样的东西:

part 1

如果你没有正确指定参数的类型:

part 2

此时,我想我会深入挖掘一下,看看能不能找到任何有趣的东西。如果你转到对象.__class__的声明,你将被引导到这里(builtins.py):

part 3

也许__class__设置为None?即使它是默认情况下,但在类被实例化时更新(这将是我猜测会发生什么),这可能是PyCharm推断__class__解析的内容。所有这些只是对我的猜测,也可能是不正确的,但是......只是为了它,如果我们将参数的类型设置为None,我们会看到什么样的行为,然后?

part 4

看起来我们将类型设置为SomeClass.__fake__时发生了同样的事情(我用SomeClass.__class__测试了它,同样的事情也发生在那里。)

所以我认为手头的问题是,为什么你不能使用@type cinstance: Bar

答案 2 :(得分:0)

对于函数,使用callable指定可以使用PyCharm。

答案 3 :(得分:0)

尝试一下:

from typing import Type

def __init__(self, klass: Type[Bar]):
    pass