Setter 没有抛出错误

Setter not throwing errors

我有一个 Node class,我想确保只接受其他 Node 对象作为它的子对象,但是 TypeError 永远不会在我的单元测试。我正在使用 python 3.

Class

class Node:

    def __init__(self, data):
        self._child = None
        self._data = data

    @property
    def child(self):
        return self._child

    @child.setter
    def child(self, child):
        if not isinstance(child, Node):
            raise TypeError(f"Children must be of type Node, not {type(child)}.")
        self._child = child

    @property
    def data(self):
        return self._data

    @data.setter
    def data(self, data):
        self._data = data

测试

def test_node_child_error():
    node = Node(1)
    with pytest.raises(TypeError):
        node.child = 2

单元测试 returns Failed: DID NOT RAISE <class 'TypeError'> 当我尝试将新值记录到 setter 内的终端时,它说 child<class 'NoneType'>,但当我之后记录它时,该值会根据 Node 对象本身发生变化。

我一直在尝试使用 PyCharm 调试器来仔细查看,但不幸的是,我在另一个文件中使用了与调试器中使用的 class 相同的 class 名称所以它不再起作用了。

我发现了这个问题,但希望得到一些解释 why/how 这解决了它。显然,问题出在每次调用 setter 时都会获得 None 类型,因此我将 setter 编辑为如下内容。

@child.setter
def child(self, child):
    if not isinstance(child, Node) and child is not None:
        raise TypeError(f"Children must be of type Node, not {type(child)}.")
    self._child = child

这不仅修复了我的测试用例,而且现在当我尝试故意抛出错误时,我得到正确的错误消息 TypeError: Children must be of type Node, not <class 'int'>. 而不是 TypeError: Children must be of type Node, not <class 'None'>.