Optional[Dict]: return {} if b els-6ren">
gpt4 book ai didi

python - mypy "Optional[Dict[Any, Any]]"在标准过滤器、映射中不可索引

转载 作者:行者123 更新时间:2023-12-05 01:37:07 24 4
gpt4 key购买 nike

给定以下代码:

from typing import Optional, Dict

def foo(b: bool) -> Optional[Dict]:
return {} if b else None


def bar() -> None:
d = foo(False)

if not d:
return

filter(lambda x: d['k'], [])

mypy 0.770 在 bar 的最后一行出现以下错误:Value of type "Optional[Dict[Any, Any]]"is not indexablemap 也是如此。从 pydash 更改行以使用列表理解或 filter_map_ 可解决错误。

即使有类型保护,为什么 mypy 在使用标准 filter 时会抛出错误?

最佳答案

ifassert 之后发生的类型缩小不会传播到您绑定(bind)该变量的内部范围。简单的解决方法是定义一个与较窄类型绑定(bind)的新变量,例如:

def bar() -> None:
d = foo(False)

if not d:
return
d_exists = d

filter(lambda x: d_exists['k'], [])

d 未绑定(bind)到内部范围中较窄类型的原因可能是因为无法保证 d 不会变回 外部范围内无,例如:

def bar() -> None:
d = foo(False)

if not d:
return

def f(x: str) -> str:
assert d is not None # this is totally safe, right?
return d['k'] # mypy passes because of the assert

d = None # oh no!
filter(f, [])

而如果您绑定(bind)一个新变量,则无法进行赋值:

def bar() -> None:
d = foo(False)

if not d:
return
d_exists = d

def f(x: str) -> str:
# no assert needed because d_exists is not Optional
return d_exists['k']

d_exists = None # error: Incompatible types in assignment
filter(f, [])

在您的特定示例中,没有运行时危险,因为 lambda 立即由 filter 评估,您没有机会更改 d同时,但 mypy 不一定有一种简单的方法来确定您调用的函数不会卡在该 lambda 上并在以后对其进行评估。

关于python - mypy "Optional[Dict[Any, Any]]"在标准过滤器、映射中不可索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61369275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com