Тип 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, Есть ли способ решить эту проблему, или если есть лучший способ конструировать конструктор класса?

1 ответ

Решение

Если ваш родительский узел может быть Noneнужно пометить аргумент как Optional или явно использовать Union[None, 'TNode'] аннотация:

from typing import List, Optional

class TNode:
    def __init__(self, parent: Optional['TNode'], data: str, children: List['TNode'] = []) -> None:

Примечание: вы, вероятно, не хотите использовать [] как значение по умолчанию для детей. Значения по умолчанию оцениваются один раз и сохраняются вместе с функциональным объектом, поэтому, если вам нужно использовать значение по умолчанию и изменить его, вы изменяете общее значение по умолчанию. См. "Наименьшее удивление" и Аргумент изменяемого по умолчанию.

Задавать 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 символов.

Другие вопросы по тегам