2015-11-27 14 views
9

La nostra applicazione ha set di procedure guidate di moduli complessi. Per evitare la duplicazione del codice ho creato diversi mixin.Ottieni PyCharm per sapere quali classi sono mixate per

Il problema è che PyCharm evidenzia i metodi di mixin con l'errore Unresolved attribute refference.
Questo è corretto come object non ha tali metodi. Ma so che questo mixin sarà usato solo con classi speciali. C'è un modo per dire queste informazioni a PyCharm?

Per ora io uso questo approccio:

class MyMixin(object): 
    def get_context_data(self, **kwargs): 
     assert isinstance(self, (ClassToBeExtended, MyMixin)) 
     # super.get_context_data is still highlighter, 
     # as super is considered as object 
     context = super(MyMixin, self).get_context_data(**kwargs) 
     context.update(self.get_preview_context()) 
     return context 

    def get_preview_context(self): 
     # without this line PyCharm highlights the self.initial_data 
     assert isinstance(self, (ClassToBeExtended, MyMixin)) 
     return {'needs': (self.initial_data['needs'] 
          if 'type' not in self.initial_data 
          else '%(needs)s %(type)s' % self.initial_data)} 

Mentre questo funziona per alcuni casi come completamento automatico per self., non riesce per altri casi come super. C'è un approccio migliore per ottenere il comportamento desiderato?

P.S .: So che posso disattivare il controllo di riferimento per nome specifico o per l'intera classe, ma non voglio farlo perché non aiuta nei controlli di battitura e nella compilazione automatica.

+0

FWIW, se pycharm non è in grado di risolvere i riferimenti di attributo, sospetto che non sia in grado né di verificare errori di digitazione né di completamento automatico (poiché non ha alcun riferimento all'utilizzo) ... –

+0

'get_context_data (self: ClassToBeExtended) '(python3 ovviamente) sembra funzionare. – gdoumenc

risposta

1

Se si sta creando Mixin, per, diciamo ClassSub, che è sottoclasse di ClassSuper, è possibile implementare Mixin questo modo:

class Mixin1(ClassSuper): 
    pass 


class Mixin2(ClassSuper): 
    pass 

e poi usarli come:

class ClassSub(Mixin1, Mixin2): 
    pass 

In questo modo uso alcuni mixin per i modelli in Django. Inoltre, django-extensions utilizza pattern simili (fornisce modelli che sono effettivamente mixin). Fondamentalmente, in questo modo non devi ereditare ClassSuper, perché è "incluso" in tutti i tuoi mix.

Più importante - PyCharm funziona come un fascino in questo modo.

2

È possibile impostare il numero type-hint a PyCharm che tipo di lezioni aspettarsi.

class DictMixin(object): 
    def megamethod(
     self, # type: dict 
     key 
    ): 
     return self.get(key) 

Non è ancora paragonabile ad altri tipi di gestione. PyCharm è pigro nel valutarlo, e lo fa solo quando lavora su self. Le cose sono un po 'complicate quando si accede agli attributi del mixin - self, # type: dict | DictMixin funziona per una delle mie classi, ma non nel mio codice di test. In python 3.5, dovresti essere in grado di utilizzare # type: typing.Union[dict, DictMixin].

Problemi correlati