Python docstring type annotation -- a class, not an instance?
According to the pycharm docs as close as you can get is:
() -> SomeClass
So in your example
def do_something(klass):
"""
:type klass: () -> A
"""
pass
This means (for PyCharm) that the argument you are providing is a function that returns an object of a given type. It will properly type hint anything after the object creation.
Guido answered this question here, but I believe PyCharm does not correctly support the appropriate syntax in Python 2. I believe the syntax should be (...) -> A
in PyCharm with Python 2. In Python 3, the appropriate syntax is Callable[..., A]
.
I note that PyCharm doesn't treat () -> A
as a class either; if you call a classmethod on A using this syntax, PyCharm inspection will flag that it can't find the referenced classmethod.
This has been filed in the JetBrains bugtracker, though was closed based on earlier comments. Given Guido's recent comments in the first reference, I'm hoping JetBrains will reopen.
The answer is Type
. If you have a typing
module installed, you can also bound this class to be a subclass of something, like in following example:
class BaseUser(): pass
class Admin(BaseUser): pass
class Staff(BaseUser): pass
class Client(BaseUser): pass
then
from typing import Type, TypeVar
U = TypeVar('U', bound=BaseUser)
def new_user(user_class):
"""
type user_class: Type[U]
"""
return user_class()
and following are the usage
new_user(Admin)
new_user(Client)
new_user(Staff)
Pycharm | IDEA understand typing
hints quite good, so it will do the trick