首页 > 解决方案 > 参数的 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. 有没有办法解决这个问题,或者是否有更好的方法来设计类构造函数?

标签: pythonpython-typing

解决方案


如果您的父节点可以是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列表。childrenNone

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


推荐阅读