预期类型“MyObject”,在带有类型提示的 __init__ 中得到“无”[重复]

Posted

技术标签:

【中文标题】预期类型“MyObject”,在带有类型提示的 __init__ 中得到“无”[重复]【英文标题】:Expected type 'MyObject', got 'None' instead in __init__ with type hints [duplicate] 【发布时间】:2020-12-09 03:08:38 【问题描述】:

在初始化实例变量时,我喜欢包含类型提示。但是,有时我还没有准备好为其分配任何特定值,我希望它以“无”开头。

self._active_cal_fluid: MyObject = None

这导致 PyCharm 给我一个检查错误: Expected type 'MyObject', got 'None' instead

我无法创建 MyObject() 的“空”版本,因为这在我的上下文中毫无意义。 如果我稍后在其他方法中等待初始化它,它会抱怨我在 init() 之外初始化了一个实例变量并且类型提示不起作用。

我更愿意启用类型提示。 我一般不想禁用此检查,我只想在对象初始化为“无”时删除此特定警告。在 PyCharm 中这样的事情是可能的吗?

【问题讨论】:

有道理,没有不是 MyObject。你试过docs.python.org/3/library/typing.html#typing.Optional吗? @jonrsharpe:这当然是有道理的,你的建议解决了它。谢谢你。您想将其发布为答案吗? 【参考方案1】:

类型注释完全错误。 在您的情况下,self._active_cal_fluid 可以有两种类型:

键入 MyObject 并键入 None

这可以写成:Union[None, MyObject]Optional[MyObject]

这里是完整的注释

from typing import Optional

...
# definition of MyObject
...

class MyClass(object):
    def __init__(self) -> None:
        self._active_cal_fluid: Optional[MyObject] = None

如果在类定义时没有定义“MyObject”,则需要使用“forward Annotation”并将类型放在引号中:

from typing import Optional

class MyClass(object):
    def __init__(self) -> None:
        self._active_cal_fluid: Optional["MyObject"] = None

...
# definition of MyObject
...

【讨论】:

以上是关于预期类型“MyObject”,在带有类型提示的 __init__ 中得到“无”[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Typescript 元素隐式地具有任何类型,带有 for...in 循环

在 GraphQL 中不能有带有嵌套字段的输入类型。错误:预期类型是 GraphQLInputType,但不是

如何正确传递带有 var 前缀的对象类型的参数?

JSON.stringify() 在值上带有单引号,在键上没有引号

带有 resultClass 参数的 NamedQuery 未返回查询结果的预期“类型”

PHPUnit 模拟和类型提示方法