python - 参数的 Python 类型可以是 None
问题描述
我正在尝试使用 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 会引发Expected type 'TNode', got 'None' instead
. 有没有办法解决这个问题,或者是否有更好的方法来设计类构造函数?
解决方案
如果您的父节点可以是None
,则需要将参数标记为Optional
或显式使用Union[None, 'TNode']
注释:
from typing import List, Optional
class TNode:
def __init__(self, parent: Optional['TNode'], data: str, children: List['TNode'] = []) -> None:
旁注:您可能不想将[]
其用作孩子的默认值。默认值被评估一次并与函数对象一起存储,因此如果您要使用默认值并对其进行更改,您将更改共享默认值。请参阅“Least Astonishment”和可变默认参数。
改为设置children
为默认None
哨兵值:
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 or []
空self.children
列表。children
None
我还为参数列表使用了不同的格式,更适合行长度超过建议的 80 个字符的行长度限制的类型注释参数。