参数的Python类型不能为None

参数的Python类型不能为None,python,python-typing,Python,Python Typing,我正在尝试创建一个带有python类型注释的树结构。代码如下所示: from typing import List class TNode: def __init__(self, parent: 'TNode', data: str, children: List['TNode'] = []): self.parent = parent self.data = data self.children = children root =

我正在尝试创建一个带有python类型注释的树结构。代码如下所示:

from typing import List

class TNode:
    def __init__(self, parent: 'TNode', data: str, children: List['TNode'] = []):
        self.parent = parent
        self.data = data
        self.children = children


root = TNode(None, 'example')

但是代码存在类型不匹配的问题,Pycharm将提出
预期的类型“TNode”,而得到“None”
。是否有解决此问题的方法,或者是否有更好的方法来设计类构造函数?

如果父节点可以是
None
,则需要将参数标记为
可选
或显式使用
联合[None',TNode']
注释:

from typing import List, Optional

class TNode:
    def __init__(self, parent: Optional['TNode'], data: str, children: List['TNode'] = []) -> None:
旁注:您可能不想将
[]
用作子项的默认值。默认值只计算一次并与函数对象一起存储,因此如果要使用默认值并对其进行修改,则需要修改共享默认值。看

children
设置为默认的
None
sentinel值:

class TNode:
    def __init__(
        self,
        parent: Optional['TNode'],
        data: str,
        children: Optional[List['TNode']] = None
    ) -> None:
        self.parent = parent
        self.data = data
        self.children = children or []
每当
children
参数为假值时,表达式将
self.children
设置为空列表,包括
None
和空列表


我还为参数列表使用了不同的格式,更适合于行长度超过建议的80个字符行长度限制的带类型注释的参数。

如果父节点可以是
None
,则需要将参数标记为
可选
或显式使用
联合[None',TNode']
注释:

from typing import List, Optional

class TNode:
    def __init__(self, parent: Optional['TNode'], data: str, children: List['TNode'] = []) -> None:
旁注:您可能不想将
[]
用作子项的默认值。默认值只计算一次并与函数对象一起存储,因此如果要使用默认值并对其进行修改,则需要修改共享默认值。看

children
设置为默认的
None
sentinel值:

class TNode:
    def __init__(
        self,
        parent: Optional['TNode'],
        data: str,
        children: Optional[List['TNode']] = None
    ) -> None:
        self.parent = parent
        self.data = data
        self.children = children or []
每当
children
参数为假值时,表达式将
self.children
设置为空列表,包括
None
和空列表


我还为参数列表使用了不同的格式,更适合于行长度超过建议的80个字符行长度限制的带类型注释的参数。

有许多Python模块可以实现此功能。我也不记得类型注释会影响行为。但是,根据您的代码,我假设第一个节点是父节点。也许您可以将类型注释替换为
parent:('TNode',None)
@NChauhan:实现什么功能?这是关于类型暗示以及如何正确使用它。类型提示是Python库的标准功能,不需要安装其他模块。@MartijnPieters我是说“树结构”已经安装好了implemented@NChauhan:是的,但是绝大多数类似的情况都是由使用这种结构的人来学习Python编码的诀窍的。相反,使用外部库将无法达到这一目的。有许多Python模块可以实现此功能。我也不记得类型注释会影响行为。但是,根据您的代码,我假设第一个节点是父节点。也许您可以将类型注释替换为
parent:('TNode',None)
@NChauhan:实现什么功能?这是关于类型暗示以及如何正确使用它。类型提示是Python库的标准功能,不需要安装其他模块。@MartijnPieters我是说“树结构”已经安装好了implemented@NChauhan:是的,但是绝大多数类似的情况都是由使用这种结构的人来学习Python编码的诀窍的。相反,使用外部库将无法达到这一目的。