写代码啊,就像盖房子一样,要是地基不稳,房子可就要塌了。这时候咱们得给Python的动态特性加上个保护罩,省得它“裸奔”了。之前用Python啊,那真是灵活到了极致,变量随时想变成什么类型都成,函数也是想吃啥就吃啥,简直随心所欲。可是你也知道,这虽然好写,可隐患也大得很。等你程序跑起来出了岔子,IDE这时候也就只能给你点儿“大概可能”的提示了。想要知道函数接口是啥样的,还得全靠看文档。要是文档写得马虎点,或者干脆没有,那维护起来简直是噩梦。所以啊,咱们得把类型注解给搞起来。 以前大家习惯在注释里写说明,文档串啥的都在那儿摆着,虽然IDE也能看个大概。可这靠人自觉的事儿吧,总免不了偷懒不写的时候。再说了,参数类型、默认值这些细节你要是不写清楚,光靠眼睛瞪也看不出来。这时候就轮到类型注解登场了。这东西语法超简单:变量名后面直接加个冒号和类型就行了。 你看啊,name: str = "张三",这样就告诉IDE了:“嘿,这个name以后就只能当字符串用啦!”变量是这样,函数也是这样。参数、返回值写在一块儿,不光是 help() 函数能查出来了,代码补全、错误高亮这些功能也都能上线了。关键是它本身不生成字节码,性能上也没啥负担。但要是你不听话,类型写歪了或者用错了地方,静态检查器立马就给你亮红灯。 不过原生的类型注解有时候也有点不够用。你光说这是个列表(List),可里面到底装着啥玩意儿呢?这时候咱们就需要 typing 模块里的 List、Tuple、Set、Dict 这些玩意儿来帮忙了。比如你要声明一个字符串列表 names: List[str],或者一个元素是整数的元组 Tuple[int, int],这样 IDE 就知道里面装的是什么货色了。这样既能保留 Python 的灵活性,又能在写代码的时候就把错误检查掉。 现在好了,大家都养成这个习惯就行了:先把注解写在前面,再去写代码逻辑。接口锁定了以后改起来也方便多了。而且这注解也不是个枷锁,运行的时候你想动态赋值还是可以的,只要别在静态检查这一步出错就行。最好呢是全组人都这么干,配合上 mypy、pyright 这些工具一起用。IDE 的提示精度立马就上去了,甚至能赶上静态语言的感觉。 说到底啊,类型注解不是给 Python 补的票子,而是把之前那种偷偷摸摸的“约定”变成了光明正大的“承诺”。一旦大家都养成了这个好习惯,动态语言那种随便变来变去的便利就全都能保留下来,心里也能踏实不少——每次调用函数就像是在合约上签了字一样!