变量类型注释到处都有用吗?

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

例如:

def some_func(num: int) -> str:
    var1: str = other_func(num)
    var2: str = 'hi'
    return var2 + var1

对内部变量进行注释是否可以(

var1
var2
)还是多余的?对于这种情况有什么约定或标准吗?

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

是的,类型注释可以有效地添加到局部变量中。 作为一个独立的项目,有些注释是多余的, 这并不一定会妨碍它们发挥作用。

如果您编码为

var2 = 'hi'
,那么
var2
仍将具有
str
类型。 你的(冗余)注释并没有告诉机器任何新的东西, 在这里它对人类没有帮助,因为意图简单明了。 但是,编码
var3: Foo = complex_function()
可能位于相同的位置 这种情况对很少调用该函数的人非常有帮助 忘记它的人总是返回 Foo。

如果更下方的条件有时会分配

None
, 那么你可以编写例如
var4: str | None = 'hi'


我们经常编写这样的代码

var5: dict[str, int] = {}
因为
mypy
和人类都需要知道映射的细节, 空的
dict
并不能表达这些细节。


如有疑问,您可以询问

mypy
显示_类型。 或者使用一个 熊型 装饰器请求运行时检查 -- if 您的代码偏离了声明的类型 它会提出致命的诊断。


0
投票

局部变量注释通常是不必要的,因为:

  • 函数返回类型通常已经提供/可推断。 (例如,

    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
    ,但最好还是显式注释,以便工具可以快速运行。

  • [意见]:局部变量很多,但范围有限(短暂)。添加注释会增加冗长性。因此,通常不值得进行权衡。

类型推断意味着静态分析工具已经可以检测类型是什么,并且编辑器已经可以通过“嵌入提示”显示它们。

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