如何在Python中声明未初始化变量的类型?

如何在Python中声明未初始化变量的类型?,python,python-3.x,types,mypy,dynamic-typing,Python,Python 3.x,Types,Mypy,Dynamic Typing,我正在学习使用mypy和静态类型检查器,同时练习算法和数据结构 在二叉搜索树中,节点初始化时没有子节点。它们属于Node类型。然而,在Python中似乎没有一个是它自己的对象类型,所以mypy在下面给了我一个错误。是否可以将未分配的子节点初始化为类型节点 binary_search_tree.py:17: error: Incompatible types in assignment (expression has type "None", variable has type "Node") b

我正在学习使用mypy和静态类型检查器,同时练习算法和数据结构

在二叉搜索树中,节点初始化时没有子节点。它们属于Node类型。然而,在Python中似乎没有一个是它自己的对象类型,所以mypy在下面给了我一个错误。是否可以将未分配的子节点初始化为类型节点

binary_search_tree.py:17: error: Incompatible types in assignment (expression has type "None", variable has type "Node")
binary_search_tree.py:18: error: Incompatible types in assignment (expression has type "None", variable has type "Node")
Found 2 errors in 1 file (checked 1 source file)
代码如下:

class Node:
    # A node has a value which is an int and two children which are nodes
    def __init__(self, value: int):
        self.value: int = value
        self.left: Node = None
        self.right: Node = None 

因为这些值有时可以是
None
,所以您应该将它们指定为
可选的
类型,然后在使用它们时执行显式的
None
检查,以便
mypy
知道它们有一个值。有关mypy
文档的更多信息:

如果将它们初始化为
None
,则不可能仅将它们声明为
节点
类型。另一个选项是创建一个
NullNode
(或类似的)子类,该子类仍然具有
Node
类型,但表示那里没有
Node

class Node:
    # A node has a value which is an int and two children which are nodes
    def __init__(self, value: int):
        self.value: int = value
        self.left: Node = NullNode()
        self.right: Node = NullNode()

class NullNode(Node):
    pass

因为这些值有时可以是
None
,所以您应该将它们指定为
可选的
类型,然后在使用它们时执行显式的
None
检查,以便
mypy
知道它们有一个值。有关mypy
文档的更多信息:

如果将它们初始化为
None
,则不可能仅将它们声明为
节点
类型。另一个选项是创建一个
NullNode
(或类似的)子类,该子类仍然具有
Node
类型,但表示那里没有
Node

class Node:
    # A node has a value which is an int and two children which are nodes
    def __init__(self, value: int):
        self.value: int = value
        self.left: Node = NullNode()
        self.right: Node = NullNode()

class NullNode(Node):
    pass

啊,谢谢。这两个选项都是合理的还是一个比另一个更标准?@user241576没问题。这两个选项都是合理的,但在这种情况下,我认为
Optional
是一个更好的选项,因为它特别意味着
节点的子节点可能存在,也可能不存在,它引入了更好的类型安全性,因为现在您必须先检查子
是否为None
,然后才能使用其值。我还认为,检查一个变量是否为
None
看起来比检查它是否有某种类型更干净。谢谢。这两个选项都是合理的还是一个比另一个更标准?@user241576没问题。这两个选项都是合理的,但在这种情况下,我认为
Optional
是一个更好的选项,因为它特别意味着
节点的子节点可能存在,也可能不存在,它引入了更好的类型安全性,因为现在您必须先检查子
是否为None
,然后才能使用其值。我还认为,检查一个变量是否为
None
比检查它是否具有某种类型更简洁