2015-04-15 6 views
6

Powiedzmy mam:Adnotacja typu docstring w Pythonie - klasa, a nie instancja?

class A(object): 
    pass 

class B(A): 
    pass 

Chcę zadeklarować funkcję, która pobiera podklasa A jako argument:

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

Co należy umieścić w WHAT_HERE? Jeśli zrobię to:

:type klass: A 

pycharm uważa, że ​​powinienem dać instancję jako argument, a nie sam klasowej.

Odpowiedz

4

Według pycharm docs tak blisko, jak można dostać się:

() -> SomeClass 

Tak w twoim przykładzie

def do_something(klass): 
    """ 
    :type klass:() -> A 
    """ 
    pass 

To oznacza (dla PyCharm), że argument, który podajesz, jest funkcją, która zwraca obiekt danego typu. Będzie poprawnie wpisać podpowiedź cokolwiek po utworzeniu obiektu.

+0

Niestety powoduje to problemy z wnioskami typu w PyCharm w celu wywołania metod klas dostępnych na A. Możesz wywołać 'klass().klassmethod() ', ale to tworzy klasę, która może nie być pożądana. Dzięki za podpowiedź, '() -> A' pomaga przynajmniej trochę. – Malina

0

Wszystkie zajęcia są instancją klasy type:

>>> class Foo: 
...  pass 
... 
>>> type(Foo()) 
<class '__main__.Foo'> 
>>> type(Foo) 
<class 'type'> 
>>> type(Foo) is type 
True 

więc ważny odpowiedź byłaby:

:type klass: type 
+0

OK, ale to po prostu mówi, że to * any * typ. Chciałbym, żeby PyCharm potraktował argument jako podklasę A. – Matt

+0

Obawiam się, że jedynym sposobem byłoby użycie metaclass. Ale nie jestem pewien, czy PyCharm to obsługuje. –

2

Guido odpowiedział na to pytanie here, ale wierzę pycharm nie obsługuje poprawnie odpowiedniej składni w Pythonie 2. Wierzę, że składnia powinna być (...) -> A w pycharm z Python 2. W Pythonie 3, odpowiednia składnia jest Callable[..., A].

Zauważam, że PyCharm nie traktuje () -> A jako klasy; jeśli wywołasz metodę class na A używając tej składni, inspekcja PyCharm będzie oznaczać, że nie może znaleźć odwołania do metody class.

To było filed in the JetBrains bugtracker, ale został zamknięty w oparciu o wcześniejsze komentarze. Biorąc pod uwagę ostatnie komentarze Guido w pierwszym odsyłaczu, mam nadzieję, że JetBrains zostanie ponownie otwarty.

0

Odpowiedź brzmi: Type. Jeśli masz zainstalowany moduł typing można również związany tą klasę być podklasą coś, jak w poniższym przykładzie:

class BaseUser(): pass   
class Admin(BaseUser): pass 
class Staff(BaseUser): pass 
class Client(BaseUser): pass 

następnie

from typing import Type, TypeVar 

U = TypeVar('U', bound=BaseUser) 

def new_user(user_class): 
    """ 
    type user_class: Type[U] 
    """ 
    return user_class() 

i są następujące użytkowania

new_user(Admin) 
new_user(Client) 
new_user(Staff) 

Pycharm | POMYSŁ rozumiemy typing podpowiedzi całkiem nieźle, więc zrobi to podstępem.