Python 让PyCharm知道混合课程的目的

Python 让PyCharm知道混合课程的目的,python,django,ide,pycharm,mixins,Python,Django,Ide,Pycharm,Mixins,我们的应用程序有一组复杂的表单向导。为了避免代码重复,我创建了几个mixin 问题是PyCharm突出显示了带有未解析属性引用的mixin方法。 这是正确的,因为对象没有此类方法。但是我知道这个mixin将只用于特殊类。有没有办法把这个信息告诉PyCharm 目前,我使用这样的方法: class MyMixin(object): def get_context_data(self, **kwargs): assert isinstance(self, (ClassToBe

我们的应用程序有一组复杂的表单向导。为了避免代码重复,我创建了几个mixin

问题是PyCharm突出显示了带有
未解析属性引用的mixin方法。
这是正确的,因为
对象
没有此类方法。但是我知道这个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
)无效。是否有更好的方法来实现期望的行为


注:我知道我可以禁用特定名称或整个类的引用检查,但我不想这样做,因为这对拼写检查和自动完成没有帮助。

如果您正在创建Mixin,例如ClassSub,它是ClassSuper的子类,您可以通过以下方式实现Mixin:

class Mixin1(ClassSuper):
    pass


class Mixin2(ClassSuper):
    pass
然后像这样使用它们:

class ClassSub(Mixin1, Mixin2):
    pass
这样,我在Django中为模型使用了一些mixin。此外,还使用类似的模式(给出了实际上是混合的模型)。基本上,这样您就不必继承
ClassSuper
,因为它“包含”在您的每个混音中

最重要的是,PyCharm的工作方式就像一个符咒。

您可以通过PyCharm了解所期望的类的类型

class DictMixin(object):
    def megamethod(
        self,  # type: dict
        key
    ):
        return self.get(key)
它仍然无法与其他类型的处理方式进行比较。 PyCharm在评估它时很懒散,而且只有在第一次处理
self
时才会这样做。 在访问mixin的属性时也有点棘手-
self,#type:dict | DictMixin
适用于我的一个类,但不适用于我的测试代码。
在中,您应该能够使用。

FWIW,如果pycharm无法解析属性引用,我怀疑它也无法检查拼写错误或自动完成(因为它没有可使用的引用).
get\u context\u data(self:ClassToBeExtended)
(当然是python3)似乎工作正常。