2015-11-27 30 views
9

Nasza aplikacja ma zestaw złożonych kreatorów formularzy. Aby uniknąć powielania kodu, stworzyłem kilka mixinów.Pobierz PyCharm, aby dowiedzieć się, jakie klasy są mixin dla

Problem polega na tym, że PyCharm zwraca uwagę na metody mixin z błędem Unresolved attribute refference.
To prawda, ponieważ object nie ma takich metod. Ale wiem, że ten mixin będzie używany tylko w klasach specjalnych. Czy istnieje sposób na przekazanie tej informacji do PyCharm?

Na razie używam takiego podejścia:

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)} 

Chociaż to działa dla niektórych przypadkach, takich jak autouzupełnianie dla self., to nie dla innych przypadkach, takich jak super. Czy istnieje lepsze podejście do osiągnięcia pożądanego zachowania?

P.S .: Wiem, że mogę wyłączyć sprawdzanie referencji dla konkretnej nazwy lub całej klasy, ale nie chcę tego robić, ponieważ nie pomoże to w sprawdzaniu literówek i autouzupełnianiu.

+0

FWIW, jeśli pycharm nie może rozpoznać odniesień do atrybutów, podejrzewam, że nie będzie on również w stanie sprawdzić ani pod kątem literówek, ani autouzupełniania (ponieważ nie ma odniesienia do użycia) ... –

+0

'get_context_data (self: ClassToBeExtended) '(python3 oczywiście) wydaje się działać. – gdoumenc

Odpowiedz

1

przypadku tworzenia wstawek, dla, powiedzmy ClassSub, która jest podklasą ClassSuper, można zaimplementować wstawek w ten sposób:

class Mixin1(ClassSuper): 
    pass 


class Mixin2(ClassSuper): 
    pass 

a następnie wykorzystać je lubię:

class ClassSub(Mixin1, Mixin2): 
    pass 

W ten sposób używam niektórych mixinów dla modeli w Django. Ponadto, django-extensions używa podobnego wzorca (daje modele, które są w rzeczywistości mixinami). Zasadniczo w ten sposób nie musisz dziedziczyć ClassSuper, ponieważ jest ona "zawarta" w każdym z twoich miksów.

Najważniejsze - PyCharm działa jak urok w ten sposób.

2

Możesz type-hint do PyCharm jakiego rodzaju zajęć oczekiwać.

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

Ciągle nie jest porównywalny z innymi rodzajami obsługi. PyCharm jest leniwy w ocenie i robi to tylko przy pierwszej pracy nad self. Rzeczy są nieco skomplikowane, gdy uzyskuję dostęp do atrybutów miksu - self, # type: dict | DictMixin działa na jednej z moich zajęć, ale nie w moim kodzie testowym. W python 3.5 powinieneś móc używać # type: typing.Union[dict, DictMixin].