【发布时间】:2020-05-26 19:22:28
【问题描述】:
我正在使用构建器模式,其中(大)类上的大多数方法都返回它们的标识 (self),因此被注释为返回它们所属的类的类型:
class TextBuilder:
parts: List[str] # omitted
render: Callable[[], str] # for brevity
def text(self, val: str) -> "TextBuilder":
self.parts.append(val)
return self
def bold(self, val: str) -> "TextBuilder":
self.parts.append(f"<b>{val}</b>")
return self
...
示例用法:
joined_text = TextBuilder().text("a ").bold("bold").text(" text").render()
# a <b>bold</b> text
现在,随着这个类越来越大,我想将相关方法拆分并分组到 mixins 中:
class BaseBuilder:
parts: List[str] # omitted
render: Callable[[], str] # for brevity
class TextBuilder(BaseBuilder):
def text(self, val: str):
self.parts.append(val)
return self
...
class HtmlBuilder(BaseBuilder):
def bold(self, val: str):
self.parts.append(f"<b>{val}</b>")
return self
...
class FinalBuilder(TextBuilder, HtmlBuilder):
pass
但是,我看不到正确注释 mixin 类的返回类型的方法,结果类 FinalBuilder 总是让 mypy 相信它返回 FinalBuilder 而不是 mixin 类之一。当然,假设我想要实际上注释 self 并返回类型,因为它们可能无法从这些方法内部发生的事情中推断出来。
我尝试将 mixin 类设为通用并将它们显式标记为返回类型 T 绑定到 BaseBuilder,但这并不满足 mypy.有任何想法吗?现在我将跳过所有这些恶作剧并在所有地方省略返回类型,因为在使用 FinalBuilder 时应该正确推断它们,但我仍然很好奇是否有一种通用的方法来解决这个问题。
【问题讨论】:
标签: python types annotations pycharm mypy