0

在我的应用程序中,有很多类的行为本质上是这样的:

class A:

    def __init__(self) -> None:
        self.subject = None

    def set_subject(self, subject: SpecificClass) -> None:
        self.subject = subject

    def do_something_with_subject(self) -> None:
        self.subject.do_stuff()

do_something_with_subject()是始终在 之后调用的程序的不变量set_subject(),但我必须在知道将主题设置为什么之前创建类A,所以现在我在__init__(). 在 的情况下subject,唯一的逻辑默认值是None

现在解决问题:我的静态类型检查器(pyright)抱怨self.subject.do_stuff(). 既然它在__init__()那个subject可以看到None,它就告诉我那个do_stuff()不是会员None。一切都非常合理,除了这不是我希望看到的警告,因为我的程序是如何运行的。我也:

  • 就像在__init__(). 它为您提供了课程内容的概述,而且我还听说一些 IDE 会查看__init__()自动完成信息。
  • 不想在代码中使用特定于类型检查器的指令来消除此警告,因为我希望其他开发人员可以自由使用他们自己喜欢的类型检查器。
  • 不想subject用类似的东西进行注释,Any从而将其排除在类型检查之外。

在这种情况下,有什么方法可以让我吃蛋糕吗?继续subject接受类型检查审查,以某种方式声明它__init__(),而不是让类型检查器认为它可以None吗?

4

2 回答 2

0

安抚类型检查器的一种轻松方法是将其作为do_something_with_subject.

assert self.subject is not None

这肯定会安抚mypy,它将这条线的所有内容拼凑在一起。

于 2021-08-03T12:49:38.257 回答
0

这可以通过使用来实现castself.subject = cast(SpecificClass, None)将返回值 ( None) 不变,但会向类型检查器发出信号,表明它具有特定类型 ( SpecificClass)。

于 2021-08-03T14:01:15.987 回答