让我说我有:
class A(object):
pass
class B(A):
pass
我想声明一个以A的子类为参数的函数:
def do_something(klass):
"""
:type klass: WHAT_HERE
"""
pass
我应该把什么放在什么地方?如果我这样做:
:type klass: A
PyCharm认为我应该将A的实例作为参数,而不是类本身。
答案 0 :(得分:4)
根据pycharm docs尽可能接近:
() -> SomeClass
所以在你的例子中
def do_something(klass):
"""
:type klass: () -> A
"""
pass
这意味着(对于PyCharm)您提供的参数是一个返回给定类型对象的函数。它将在创建对象后正确键入提示。
答案 1 :(得分:2)
Guido回答了这个问题here,但我相信PyCharm并没有正确支持Python 2中的相应语法。我相信PyCharm中的语法应该是(...) -> A
和Python 2.在Python 3中,适当的语法是Callable[..., A]
。
我注意到PyCharm也不会将() -> A
视为一个类;如果你使用这种语法在A上调用classmethod,PyCharm检查将标记它找不到引用的classmethod。
这已经filed in the JetBrains bugtracker,但是根据之前的评论已经结束。鉴于Guido最近在第一篇文章中的评论,我希望JetBrains能够重新开放。
答案 2 :(得分:2)
答案是Type
。如果您安装了typing
模块,您还可以将此类绑定为某个类的子类,如下例所示:
class BaseUser(): pass
class Admin(BaseUser): pass
class Staff(BaseUser): pass
class Client(BaseUser): pass
然后
from typing import Type, TypeVar
U = TypeVar('U', bound=BaseUser)
def new_user(user_class):
"""
type user_class: Type[U]
"""
return user_class()
以下是用法
new_user(Admin)
new_user(Client)
new_user(Staff)
Pycharm | IDEA理解typing
提示相当不错,因此它可以解决问题
答案 3 :(得分:0)
所有类都是type
类的实例:
>>> class Foo:
... pass
...
>>> type(Foo())
<class '__main__.Foo'>
>>> type(Foo)
<class 'type'>
>>> type(Foo) is type
True
所以,一个有效的答案是:
:type klass: type
答案 4 :(得分:0)
无法在PyCharm或IDEA中使用Python 2的文档字符串语法来做到这一点。
但是,您可以通过在用法上方放置一个assert
语句来获得变量的代码完成:
def call_foo(cls):
"""
Calls the class method ``foo`` of the given class.
:param cls: a subclass of SomeClass
:type cls: type
"""
assert issubclass(cls, SomeClass)
cls.foo() # you'll get code completion here for the foo method defined in SomeClass