Ошибка проверки типа mypy для вложенного dataclass 3.7 - PullRequest
0 голосов
/ 16 октября 2018
@dataclass
class A:
    one: int = 0
    two: str = ""


@nested_dataclass
class B:
    three: A
    four: str


@nested_dataclass
class C:
    five: B
    six: str


obj = C(five={"three":{"one": 23, "two":"narf"}, "four": "zort"}, six="fnord")

print(obj.five.three.two)

Этот код правильный в зависимости от функциональности, я думаю.Но когда я запускаю mypy src --ignore-missing-imports, я получаю следующую ошибку:

run.py:50: error: Unexpected keyword argument "five" for "C"
run.py:50: error: Unexpected keyword argument "six" for "C"

Было бы очень полезно, если бы кто-нибудь помог мне преодолеть это.Спасибо

1 Ответ

0 голосов
/ 16 октября 2018

Mypy понятия не имеет, что такое nested_dataclass - он не выглядит как декоратор, являющийся стандартной частью модуля классов данных.

Следовательно, mypy не сможет понять, что именноПри создании экземпляра C. возникает особая логика. Что касается mypy, то C является обычным старым классом и не имеет конструктора.

Возможны два возможных решения:

  1. Просто используйте @dataclass и отбросьте любую пользовательскую логику, которую вы используете.
  2. Напишите плагин для mypy, который сможет понять декоратор @nested_dataclass.Вы можете получить некоторые примеры того, как это выглядит, посмотрев на плагин dataclasses, который входит в mypy .
...