Python docstring类型注释 - 一个类,而不是一个实例?

时间:2015-04-15 15:37:06

标签: python pycharm

让我说我有:

class A(object):
   pass

class B(A):
   pass

我想声明一个以A的子类为参数的函数:

def do_something(klass):
   """
   :type klass: WHAT_HERE
   """
   pass

我应该把什么放在什么地方?如果我这样做:

:type klass: A

PyCharm认为我应该将A的实例作为参数,而不是类本身。

5 个答案:

答案 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