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
添加回答
舉報