给None赋值时如何正确使用Optional?
How to use Optional correctly when assigning to None?
我遇到了与 所述类似的问题,我可以使用以下示例(使用 py3.8)重现该问题;我有两个 类 这样的:
from typing import Optional
class B:
def __init__(self, name):
self.name = name
class A:
def __init__(
self,
name: str,
clb: Optional[B] = None,
):
self.name = name
if clb is not None:
if isinstance(clb, B):
self.clb = clb
else:
raise TypeError("clb has to be of type B.")
else:
self.clb = None
如果我现在做
mypy filename.py
我会收到
error: Incompatible types in assignment (expression has type "None",
variable has type "B")
如果我这样做,我可以摆脱这个错误
self.name = name
self.clb = None
if clb is not None:
...
还有其他方法可以避免这个错误吗?
简单的解决方案是只在一个地方赋值给变量。
def __init__(self, name: str, clb: Optional[B] = None):
self.name = name
self.clb = clb
在我看来,您应该完全取消 isinstance
检查。 Mypy 现在负责检查你的类型,手动检查有点多余。
将检查压缩为涵盖所有可能变体的单个测试。使用结果执行单个赋值:
if clb is None or isinstance(clb, B):
self.clb = clb
else:
raise TypeError("clb has to be of type B.")
我遇到了与
from typing import Optional
class B:
def __init__(self, name):
self.name = name
class A:
def __init__(
self,
name: str,
clb: Optional[B] = None,
):
self.name = name
if clb is not None:
if isinstance(clb, B):
self.clb = clb
else:
raise TypeError("clb has to be of type B.")
else:
self.clb = None
如果我现在做
mypy filename.py
我会收到
error: Incompatible types in assignment (expression has type "None", variable has type "B")
如果我这样做,我可以摆脱这个错误
self.name = name
self.clb = None
if clb is not None:
...
还有其他方法可以避免这个错误吗?
简单的解决方案是只在一个地方赋值给变量。
def __init__(self, name: str, clb: Optional[B] = None):
self.name = name
self.clb = clb
在我看来,您应该完全取消 isinstance
检查。 Mypy 现在负责检查你的类型,手动检查有点多余。
将检查压缩为涵盖所有可能变体的单个测试。使用结果执行单个赋值:
if clb is None or isinstance(clb, B):
self.clb = clb
else:
raise TypeError("clb has to be of type B.")