我有两个功能:
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
will never没有。
当我跑步时mypy
针对这个文件,我当然会得到错误:
error: Argument 1 of "bar" has incompatible type "Optional[str]"; expected "str"
这是有道理的。
我可以添加一个assert foo is not None
声明,但这是热路径代码,在我的测试中它具有可测量的性能影响。我只想为 mypy 进行类型断言。我怎么做?
编辑:我也尝试添加评论#type: str
在赋值语句之后,但这会产生类似的错误
你不会为此感到高兴的。向静态类型检查器断言值具有特定类型的官方设计方法是typing.cast https://docs.python.org/3/library/typing.html#typing.cast,我相信这是一个具有实际运行时间成本的实际函数more比assert
你想更换。它只是返回第二个参数不变,但仍然有函数调用开销。 Python 的类型注释系统并不是采用零开销类型断言语法设计的。
作为替代方案,您可以使用Any
作为“逃生舱口”。如果你注释foo
与类型Any
, mypy 应该允许bar
称呼。局部变量注释没有运行时成本,因此唯一的运行时成本是额外的局部变量存储和查找:
from typing import Any
def f(params):
foo: Any = get_foo(params)
return bar(foo)
除此之外,您最好的选择可能是使用assert
并使用以下命令运行 Python-O
标志,禁用断言。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)