2013-04-06 11 views
48

In python 3 posso creare argomenti e restituire annotazioni di tipo. Esempio:mettendo la classe corrente come annotazione del tipo di ritorno

class Graph: 
    def __init__(self, V: int, E: int, edges: list): 
     pass 

    @classmethod 
    def fromfile(cls, readobj: type(sys.stdin)): 
     pass 

    def V(self) -> int: 
     pass 

    def E(self) -> int: 
     pass 

Il problema è che non può fare un'annotazione con tipo di ritorno della classe corrente (grafico), che non è ancora definita. Esempio:

class Graph: 
    def reverse(self) -> Graph: 
     pass 

Questo codice va con l'errore

def reverse(self) -> Graph: 
NameError: name 'Graph' is not defined 

Queste annotazioni sono davvero utili sia per la documentazione e permettendo IDE di riconoscere argomento e tornare tipi => Abilita completamento automatico

UPD: Quindi quello che ho scoperto è che è impossibile o richiede alcuni hack che non mi piacciono, quindi ho deciso di usare solo def reverse (self) -> 'Graph': che è comprensibile per documenta anche se infrange la regola. Lo svantaggio è che non funziona per il completamento automatico IDE.

+0

Avete provato: 'def reverse (self) -> type (self)' – Ankur

+0

possibile duplicato di [Perché il nome della classe contenitore non è riconosciuto come annotazione della funzione del valore di ritorno?] (Http: // stackoverflow. it/questions/15741887/why-is-the-name-of-the-contenenti-class-not-recognised-as-a-return-value-functio) – eryksun

+2

Possibile duplicato di [Come specificare che il tipo restituito di un metodo è uguale alla classe stessa in python?] (https://stackoverflow.com/questions/33533148/how-do-i-specify-that-the-return-type-of-a-method-is- the-same-the-class-itsel) –

risposta

29

Quindi ora dopo un po 'posso dire che la decisione che ho preso è stata utilizzando -> 'Graph' anziché -> Graph. Non rende il mio IDE (PyCharm) in grado di riconoscere un tipo in questo modo ma funziona abbastanza bene per scopi di documentazione.

Un'altra possibile soluzione ho potuto utilizzare stava cambiando annotazioni in fase di esecuzione, ma che non risolve il problema con la documentazione - non si vuole cercare dichiarazioni di tipo qualche parte nel mezzo di fonti ...

Il il problema ha radici nel riconoscere l'oggetto di classe prima che la classe fosse effettivamente definita. Questo è semplicemente impossibile da fare in Python.

+19

In realtà, questa è una soluzione corretta per un problema noto come forward reference - https://www.python.org/dev/peps/pep-0484/#forward-references . E l'attuale versione di PyCharm (nel momento in cui scrivo questo commento) riconosce una tipografia scritta e offre tutto il supporto necessario. –

Problemi correlati