Тип 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 символов.