给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.")