我使用了很多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没有任何问题可以理解我们是在谈论类而不是实例。
以下是我的尝试:
答案 0 :(得分:2)
PyCharm的支持告诉我以下内容:
正如PyCharm开发人员所说:你无法区分类型提示中的类和实例。类型提示中的类名称表示该类的实例是预期的。如果您的函数接受类本身,则您的选项要么根本不使用类型提示,要么使用'类型'作为班级名称。无论如何,在这些情况下,没有任何有用的代码完成。另请参阅https://youtrack.jetbrains.com/issue/PY-11615。
规定参数的唯一方法是使用:type arg: type
类,但完成工作不会很好。目前没有其他办法。
答案 1 :(得分:1)
如果要指定参数的类型为SomeClass
,则应将其声明为:
@type (param): SomeClass
指定正确,你应该得到这样的东西:
如果你没有正确指定参数的类型:
此时,我想我会深入挖掘一下,看看能不能找到任何有趣的东西。如果你转到对象.__class__
的声明,你将被引导到这里(builtins.py
):
也许__class__
设置为None
?即使它是默认情况下,但在类被实例化时更新(这将是我猜测会发生什么),这可能是PyCharm推断__class__
解析的内容。所有这些只是对我的猜测,也可能是不正确的,但是......只是为了它,如果我们将参数的类型设置为None
,我们会看到什么样的行为,然后?
看起来我们将类型设置为SomeClass.__fake__
时发生了同样的事情(我用SomeClass.__class__
测试了它,同样的事情也发生在那里。)
所以我认为手头的问题是,为什么你不能使用@type cinstance: Bar
?
答案 2 :(得分:0)
对于函数,使用callable
指定可以使用PyCharm。
答案 3 :(得分:0)
尝试一下:
from typing import Type
def __init__(self, klass: Type[Bar]):
pass