例如:
def some_func(num: int) -> str:
var1: str = other_func(num)
var2: str = 'hi'
return var2 + var1
对内部变量进行注释是否可以(
var1
,var2
)还是多余的?对于这种情况有什么约定或标准吗?
是的,类型注释可以有效地添加到局部变量中。 作为一个独立的项目,有些注释是多余的, 这并不一定会妨碍它们发挥作用。
如果您编码为
var2 = 'hi'
,那么 var2
仍将具有 str
类型。
你的(冗余)注释并没有告诉机器任何新的东西,
在这里它对人类没有帮助,因为意图简单明了。
但是,编码 var3: Foo = complex_function()
可能位于相同的位置
这种情况对很少调用该函数的人非常有帮助
忘记它的人总是返回 Foo。
如果更下方的条件有时会分配
None
,
那么你可以编写例如var4: str | None = 'hi'
。
我们经常编写这样的代码
var5: dict[str, int] = {}
因为mypy
和人类都需要知道映射的细节,
空的 dict
并不能表达这些细节。
如有疑问,您可以询问
mypy
显示_类型。
或者使用一个
熊型
装饰器请求运行时检查 -- if
您的代码偏离了声明的类型
它会提出致命的诊断。
局部变量注释通常是不必要的,因为:
函数返回类型通常已经提供/可推断。 (例如,
other_func
可能已被输入 int -> str
。)
【意见】:在函数中添加注解比变量注解更简单。
比较:
def ordinal(x):
special = {1: "st", 2: "nd", 3: "rd"}
return special.get(x, "th")
first: str = ordinal(1)
second: str = ordinal(2)
third: str = ordinal(3)
fourth: str = ordinal(4)
fifth: str = ordinal(5)
与在签名中只执行一次相比:
def ordinal(x: int) -> str:
special = {1: "st", 2: "nd", 3: "rd"}
return special.get(x, "th")
first = ordinal(1)
second = ordinal(2)
third = ordinal(3)
fourth = ordinal(4)
fifth = ordinal(5)
注意:有些工具已经可以推断出返回类型是
str
,但最好还是显式注释,以便工具可以快速运行。
[意见]:局部变量很多,但范围有限(短暂)。添加注释会增加冗长性。因此,通常不值得进行权衡。
类型推断意味着静态分析工具已经可以检测类型是什么,并且编辑器已经可以通过“嵌入提示”显示它们。