hsc*_*hsc 1 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 = TNode(None, 'example')
Run Code Online (Sandbox Code Playgroud)
但是代码存在类型不匹配的问题,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:
Run Code Online (Sandbox Code Playgroud)
旁注:你可能不希望使用[]作为孩子们的默认值。默认值被评估一次并与函数对象一起存储,所以如果你要使用默认值并改变它,你改变了共享的默认值。请参阅“最小惊讶”和可变默认参数。
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 []
Run Code Online (Sandbox Code Playgroud)
的children or []表达将设置self.children到每当空列表children参数是一个falsey值,包括None与一个空列表。
我还对参数列表使用了不同的格式,更适合行长度超过推荐的 80 个字符的行长度限制的类型注释参数。
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |