python:影子变量类型提示

问题描述 投票:0回答:2

由于 python 是一种动态类型语言,我希望它可以隐藏变量类型提示。

是否可以在某个时刻更新变量的类型提示?

在下面的示例中,我期望

classes
的类型变为
list[tuple[int, str]] | None
,因为我更改了
if
循环中的值。 我知道我可以为列表创建一个新变量,但我更喜欢用新值来隐藏字典,因为它不再是必要的。

那么,是否可以在不引入新变量的情况下做到这一点?

def foo(classes: Optional[dict[int, str]] = None):
    if classes is not None:
        classes = list(classes.items()) # `classes` type is not updated
        classes.sort(key=lambda x: x[0])

    a = classes # expecting list[tuple[int, str]] | None, got dict[int, str] | None
> mypy .\foo.py
foo.py:6: error: Incompatible types in assignment (expression has type "List[Tuple[int, str]]", variable has type "Optional[Dict[int, str]]")
foo.py:7: error: "Dict[int, str]" has no attribute "sort"
Found 2 errors in 1 file (checked 1 source file)

enter image description here

enter image description here

python python-typing mypy
2个回答
0
投票

if 语句打开一个新分支,只有在运行时我们才知道循环之外的类是 None 还是列表。 在里面,如果我们理论上知道它,但这取决于类型提示的实现和 ast 构建的彻底程度。

您可以强制更新类型提示 - 不过取决于较低级别的实现

classes : Union[List[Tuple[int, str]], None] # without any declaration after, the loop

编辑:对于 Spyder,最后一次重新声明类有效,但它不支持 Union 或Optional。其他 IDE 也可以 enter image description here


0
投票

我发现这个博客指出 MyPy 无法更改变量类型,最好的解决方案是创建一个新变量。

© www.soinside.com 2019 - 2024. All rights reserved.