gpt4 book ai didi

python - 如何进行类型注释类型断言?

转载 作者:太空宇宙 更新时间:2023-11-03 23:55:17 24 4
gpt4 key购买 nike

我有两个功能:

def get_foo(params) -> Optional[str]
def bar(foo: str)

以及将这些函数链接在一起的函数:

def f(params):
# other stuff up here
foo = get_foo(params)
return bar(foo)

根据函数中发生的其他事情,我知道 get_foo 的结果永远不会为 None。

当我针对这个文件运行 mypy 时,我当然会遇到错误:

error: Argument 1 of "bar" has incompatible type "Optional[str]"; expected "str"

这是有道理的。

我可以添加一个 assert foo is not None 语句,但这是热路径代码,在我的测试中它具有可衡量的性能影响。 我只想为 mypy 做一个类型断言。我该怎么做?

编辑:我还尝试在赋值语句后添加注释 #type: str,但这会产生类似的错误

最佳答案

你不会对此感到高兴。向静态类型检查器断言值具有特定类型的官方设计方法是 typing.cast ,这是一个具有实际运行时成本的实际函数,我相信比您要替换的 assert 昂贵。它只是返回它的第二个参数不变,但它仍然有函数调用开销。 Python 的类型注释系统并未设计为零开销类型断言语法。

作为替代方案,您可以使用 Any 作为“逃生舱口”。如果您使用 Any 类型注释 foo,mypy 应该允许 bar 调用。局部变量注释没有运行时成本,因此唯一的运行时成本是额外的局部变量存储和查找:

from typing import Any

def f(params):
foo: Any = get_foo(params)
return bar(foo)

除此之外,您最好的选择可能是使用 assert 并使用 -O 标志运行 Python,这将禁用断言。

关于python - 如何进行类型注释类型断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57931661/

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