我正在嘗試在高效功能(試圖避免復制)中執行以下(簡化示例),而不使用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 抱怨強制轉換為“分配中不兼容的型別”,但這是我想要做的。我如何實作這一目標?我認為a是違規者 - 它是輸出型別所必需的
我不想:
# kill Mytd1
Mytd_extra = TypedDict("Mytd_extra", {x: int, z: NotRequired[str]})
因為這將允許客戶通過,{x: 5, z: "asdf"}但foo應該禁止 - 他們只允許通過{x: 5}。
我認為以下是可行的,但我試圖避免它以提高效率,因為這個函式被多次呼叫:
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
uj5u.com熱心網友回復:
您至少有兩個完全有效的解決方案(假設 python 3.11 不打擾typingvs typing_extensions,如果需要調整您的匯入)。問題是它y是 type 的Mytd1,所以你不能給Mytd_extra它賦值(轉換結果)。
使用另一個變數
from typing import TypedDict, NotRequired, cast
Mytd1 = TypedDict("Mytd1", {'a': NotRequired[str], 'x': int})
Mytd_extra = TypedDict("Mytd_extra", {'a': str, 'x': int, 'z': str})
def foo(orig_y: Mytd1) -> Mytd_extra:
# users input object should NOT contain z
y = cast(Mytd_extra, orig_y)
y["z"] = "hooray"
if "a" not in y:
y["a"] = "whatever"
return y
這是具有此解決方案的游樂場。
允許重新定義(mypy 標志)
保留您的原始代碼,但使用--allow-redefinition (或添加allow_redefinition = true到您使用的組態檔)運行:playground。
警告: allow_redefinition沒有 Super Cow Powers,它的用例僅限于單一場景:當 RHS 中的運算式包含此變數時,分配給預定義變數。它允許以下操作:
y = 'abc'
y = list(y)
但不是這個:
y = 'abc'
y = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/485514.html
標籤:python-3.x 我的
上一篇:RuntimeWarning:從未等待協程“claimcode”。啟用tracemalloc以獲取物件分配回溯(telebot)
下一篇:將不規則串列轉換為字典
