获取 PyCharm 以了解 类 的 mixin 用途

Get PyCharm to know what classes are mixin for

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

问题是 PyCharm 突出显示了带有 Unresolved attribute refference 错误的混合方法。
这是正确的,因为 object 没有这样的方法。但我知道这个 mixin 只会与特殊的 classes 一起使用。有什么方法可以将此信息告诉 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.: 我知道我可以禁用特定名称或整个 class 的参考检查,但我不想这样做,因为它无济于事在拼写错误检查和自动完成中。

如果你正在创建 Mixin,比如说 ClassSub,它是 ClassSuper 的子类,你可以这样实现 Mixin:

class Mixin1(ClassSuper):
    pass


class Mixin2(ClassSuper):
    pass

然后像这样使用它们:

class ClassSub(Mixin1, Mixin2):
    pass

这样我就可以在 Django 中为模型使用一些 mixins。此外,django-extensions 使用类似的模式(给出实际上是 mixins 的模型)。基本上,这样你就不必继承 ClassSuper,因为它在你的每个 mixin 中都是 "included"。

最重要的是 - PyCharm 这种方式很有魅力。

你可以type-hint到PyCharm期待什么样的类。

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

它仍然不能与其他类型处理相媲美。 PyCharm 懒于评估它,只有在第一次处理 self 时才这样做。 访问 mixin 的属性时,事情也有点棘手 - self, # type: dict | DictMixin 适用于我的 类 之一,但不适用于我的测试代码。 在 python 3.5, you should be able to use # type: typing.Union[dict, DictMixin].