2015-07-10 12 views
7

Uso molto il parser del tipo dococessing Pycharm per specificare i tipi di parametri e restituzioni dei metodi, gli attributi o la variabile di istanza. Se funziona quasi tutto il tempo, ho un piccolo problema di raccontare PyCharm sto dando una funzione o una classe come parametro/attributo/...Come specificare la classe o il tipo di funzione in docstring per parser PyCharm

Ecco un breve esempio:

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) 

Se Ho appena inserito Bar invece di Bar.__class__, ovviamente PyCharm mi ha detto che non è possibile chiamare Bar. Quindi, come dirgli che gli sto dando la lezione?

Si noti che con il decoratore @classmethod, PyCharm non ha alcun problema a capire che stiamo parlando della classe e non dell'istanza.

Qui sono i miei tentativi:

Attempt with <code>Bar.__name__</code>

Attempt with <code>Bar.__class__</code>

Attempt with <code>Bar</code>

+1

Un biglietto JetBrain è aperto: https://intellij-support.jetbrains.com/hc/en-us/requests/66648 – FunkySayu

risposta

2

supporto Il PyCharm mi ha detto quanto segue:

Come PyCharm sviluppatore ha detto: non è possibile distinguere le classi e le istanze di tipi di suggerimenti. Il nome di una classe in un suggerimento tipo indica che è prevista un'istanza di tale classe. Se la tua funzione accetta la classe stessa, le tue opzioni o non usare affatto i suggerimenti sui tipi o usare il 'tipo' come nome di classe. In ogni caso, non ci sarà alcun completamento del codice utile in questi casi. Vedi anche https://youtrack.jetbrains.com/issue/PY-11615.

L'unico modo per specificare un argomento è una classe è utilizzare :type arg: type, ma il completamento non funzionerà correttamente. Non c'è altro modo al momento.

+1

In questi casi di solito uso il tipo con parametro '': tipo arg: type [SomeClass] ''. Non fornisce l'aiuto per la sintassi, ma è una sintassi di suggerimento del tipo valida ed è più specifica del solo '' tipo''. – warownia1

1

Se si desidera specificare che un parametro è di tipo SomeClass, esso dovrebbe essere dichiarato come tale:

@type (param): SomeClass 

specificato correttamente, si dovrebbe ottenere qualcosa di simile:

part 1

Se non si specificare il tipo di parametro corretto:

part 2

A questo punto, mi Ho pensato di scavare un po 'più a fondo per vedere se riuscivo a trovare qualcosa di interessante. Se si va alla dichiarazione di un oggetto di .__class__, sarete indirizzati qui (in builtins.py):

part 3

Forse __class__ è stato fissato a None? Anche se è di default, ma poi aggiornato quando la classe viene istanziata (che sarebbe la mia ipotesi su cosa succede), questo potrebbe essere ciò a cui PyCharm deduce __class__. Tutto questo è solo speculazione da parte mia e potrebbe anche essere errato, ma ... Solo per il gusto di farlo, quale comportamento possiamo vedere se impostiamo il tipo di parametro su None, quindi?

part 4

sembra la stessa cosa che è successo quando abbiamo fissato il tipo di SomeClass.__fake__ (e ho provato con SomeClass.__class__, e la stessa cosa accade anche lì.)

quindi suppongo che la questione a la mano è, perché non puoi usare @type cinstance: Bar?

+0

FYI, grazie a [questa risposta] (http://stackoverflow.com/a/ 22552647/4009370) per lo stile di documentazione supportato da PyCharm –

+0

Ho letto la tua risposta ma non sono sicuro che tu abbia riscontrato il problema: sto cercando un modo per passare una classe come attributo e non un'istanza come attributo. Sapevo che per un'istanza, '@param toto: Bar' va bene, ma come dire" Voglio come parametro una classe non istanziata uguale o ereditata da Bar "? – FunkySayu

+0

@FunkySayu vedo. Hai provato '.__ nome__' o solo' classe'? Inoltre, se ti capita di lavorare 'class', non sono sicuro che farà ciò che vuoi che faccia, perché un oggetto' class' non avrà alcuna conoscenza di quale classe in realtà si risolve (giusto?) –

0

Per le funzioni, specificare utilizzando callable funziona con PyCharm.

Problemi correlati