2015-11-27 2 views
9

Наше приложение имеет набор сложных форм-магов. Чтобы избежать дублирования кода, я создал несколько микшинов.Получить PyCharm, чтобы узнать, какие классы являются mixin для

Проблема заключается в том, что PyCharm выделяет методы mixin с ошибкой Unresolved attribute refference.
Это верно, так как object не имеет таких методов. Но я знаю, что этот mixin будет использоваться только со специальными классами. Есть ли способ рассказать эту информацию PyCharm?

Сейчас я использую такой подход:

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

Хотя это работает для некоторых случаев, как автозаполнение для self., она не для других подобных случаев super. Есть ли лучший подход к достижению желаемого поведения?

P.S .: Я знаю, что я могу отключить контрольную проверку для определенного имени или всего класса, но я не хочу этого делать, поскольку это не поможет в опечатке и автозаполнении.

+0

FWIW, если pycharm не может разрешить ссылки на атрибуты, я подозреваю, что он также не сможет ни проверить опечатки, ни автозаполнение (поскольку у него нет ссылки на использование) ... –

+0

'get_context_data (self: ClassToBeExtended) '(python3, конечно), кажется, работает. – gdoumenc

ответ

1

Если вы создаете подмешать, ибо, скажем ClassSub, который является подклассом ClassSuper, вы можете реализовать Примеси таким образом:

class Mixin1(ClassSuper): 
    pass 


class Mixin2(ClassSuper): 
    pass 

, а затем использовать их любят:

class ClassSub(Mixin1, Mixin2): 
    pass 

Таким образом, я использую некоторые mixins для моделей в Django. Кроме того, django-extensions использует аналогичный шаблон (дает модели, которые на самом деле являются миксинами). В принципе, таким образом вам не нужно наследовать ClassSuper, потому что он «включен» в каждый из ваших миксинов.

Главное - PyCharm работает как очарование таким образом.

2

Вы можете type-hint PyCharm, какие классы ожидать.

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

Это все еще не совсем сопоставимо с другими типами обработки. PyCharm ленив в оценке, и делает это только при первой работе на self. . При доступе к атрибутам микшинга также немного сложно - self, # type: dict | DictMixin работает для одного из моих классов, но не в моем тестовом коде. В python 3.5 вы должны иметь возможность использовать # type: typing.Union[dict, DictMixin].

Смежные вопросы