2015-04-29 27 views
5

Come caso minimo, ho una classe Example che funziona come una capacità astratta per una gamma di altre classi.Indicare i campi generati dal codice PyCharm della classe

class Example(object): 
    def __init__(self, **kwargs): 
     for key, value in kwargs.items(): 
      setattr(self, key, value)    

class Test(Example): 
    def __init__(self, foo='bar'): 
     super(Test, self).__init__(foo=foo) 

Nel caso reale, Example fa più cose.

C'è un modo per comunicare su Test PyCharm che Test avrà un campo Test.foo e anche meglio, farle sapere che foo dovrebbe essere una stringa?

Per essere chiari, non è possibile delegare l'impostazione dei campi da Example a Test.

Il più vicino che ho ottenuto è il @ivar di Epydoc, ma non posso farlo funzionare

+1

AFAIK, non è possibile. Se si definiscono i membri di un oggetto dinamicamente, è necessario dimenticare i suggerimenti. È possibile definire gli attributi di classe su 'Test' che sarà" ombreggiato "dagli attributi di istanza, ma non vale il prezzo. Basta vivere con esso. – bgusach

+0

* sospiro *, vabbè, ma grazie per la risposta. – deinonychusaur

+0

Sì pitty, ma Pycharm dovrebbe essere estremamente intelligente per capire il codice e offrirti suggerimenti. In molti casi evito il codice "dinamico" a favore del codice "digitato manualmente" solo per avere un po 'più di sicurezza e godere anche delle annotazioni. Alla fine è un problema generale dei linguaggi tipizzati dinamicamente ... Gli IDE non possono fare troppo. – bgusach

risposta

3

Ho avuto esattamente lo stesso problema si sta affrontando. non volevo codice suggerimento Volevo solo PyCharm per fermare avvertendomi sugli attributi non definiti (foo is not attribute of class Test)

non ho potuto risolvere il problema suggerendo codice, ma ho superato l'avvertimento implementando Example classe come quella

5

Come altri hanno già detto, non è possibile. Tuttavia, si può dire PyCharm di accettare gli attributi mancanti con @DynamicAttrs:

class Example(object): 
    """ 
    @DynamicAttrs 
    """ 
    def __init__(self, **kwargs): 
     for key, value in kwargs.items(): 
     setattr(self, key, value) 

Aggiornamento: Se Python3.5 è un'opzione, vedere this question sull'utilizzo di tipo suggerimenti per gli attributi dinamici.