Я пытаюсь выполнить следующее (упрощенный пример) в высокоэффективной функции (пытаясь избежать копирования) без использования NotRequired (по причинам, указанным ниже):
Mytd1 = TypedDict("Mytd1", {a: NotRequired[str], x: int})
Mytd_extra = TypedDict("Mytd_extra", {a: str, x: int, z: str})
def foo(y: Mytd1) -> Mytd_extra:
# users input object should NOT contain z
y = cast(Mytd_extra, y). # fails - my guess is `a` is the offender
y["z"] = "hooray"
if "a" not in y:
y["a"] = "whatever"
return y
Mypy жалуется на приведение типов как на «несовместимые типы при назначении», но я именно это и хочу сделать. Как мне этого добиться? Я думаю, что является нарушителем - он необходим для типа вывода
Я не хочу:
# kill Mytd1
Mytd_extra = TypedDict("Mytd_extra", {x: int, z: NotRequired[str]})
потому что это позволит клиенту передать {x: 5, z: "asdf" в foo, но это должно быть запрещено - они только разрешено передавать {x: 5}.
Я думаю, что следующее было бы выполнимо, но я стараюсь избегать этого для повышения эффективности, поскольку эта функция вызывается много раз:< /p>
def foo(y: Mytd1) -> Mytd_extra:
new_var: Mytd_extra = {k: v for k:v in y.items()}
new_var["z"] = "ohno"
return new_var
Подробнее здесь: https://stackoverflow.com/questions/724 ... assignment