获取 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]
.
我们的应用程序有一组复杂的表单向导。为了避免代码重复,我创建了几个 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]
.