预期类型“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,但不是
JSON.stringify() 在值上带有单引号,在键上没有引号