参数的Python类型不能为None
我正在尝试创建一个带有python类型注释的树结构。代码如下所示:参数的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 =
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编码的诀窍的。相反,使用外部库将无法达到这一目的。