第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

mypy lambda 可選檢查

mypy lambda 可選檢查

叮當貓咪 2024-01-27 15:24:59
我注意到 mypy 在進入 lambda 范圍時會忘記類型信息。下面用一個小例子來解釋一下:from typing import Optional, Callabledef wrapper(x: Callable[[], None]):    x()def foo(a: int):    print(str(a))a: Optional[int] = 0if a is None:    exit()wrapper(lambda: foo(a))Mypy 抱怨這個片段錯誤:Argument 1 to "foo" has incompatible type "None"; expected "int"。然而,我們已經(jīng)檢查過 a 不是None之前的。這是非常奇怪的,因為如果我們直接調(diào)用foo(a)(沒有包裝器),它確實可以工作。我正在使用 python 3.6.10 和 mypy 0.740。這是有意的行為嗎?如果是這樣,您將如何正確輸入此內(nèi)容?
查看完整描述

1 回答

?
蠱毒傳說

TA貢獻1895條經(jīng)驗 獲得超3個贊

這不是由于lambda,而是由于a關閉。簡而言之,即使特定代碼無法觸發(fā)錯誤路徑,該函數(shù)在技術上也是錯誤的。


與修復函數(shù)中的閉包的類似問題一樣,強制在定義時評估名稱可以提供有效的類型:


wrapper(lambda a=a: foo(a))

請注意,mypy 無法正確推斷l(xiāng)ambda類型,因此lambda這樣使用仍然會導致錯誤Cannot infer type of lambda。


考慮完全等效的命名函數(shù):


def l() -> None:

    # reveal_type(a) -> Union[builtins.int, None]

    return foo(a)

注意這里是如何可見的,而不是守衛(wèi)之后的a: Optional[int]減少。所以問題不是來自而是來自。a: inta is Nonelambdadef


問題的根源在于 和l的所有值都lambda接近。即使在定義/之前已被拒絕,稍后重置也是有效的。aa: Nonellambdaa


a: Optional[int]


if a is None: exit()


def l() -> None:

    # reveal_type(a) -> Union[builtins.int, None]

    return foo(a)


a = None


查看完整回答
反對 回復 2024-01-27
  • 1 回答
  • 0 關注
  • 150 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號