【Python】和BUG说再见!

本人才疏学浅,如有错漏之处,敬请指出!

今天来聊一下如何提高代码可读性和降低后期代码重构难度的问题。

众所周知 Python是一个动态语言,是一种弱类型的语言,对于变量的类型没有Java之类的静态编译语言那么严格,因此代码写起来是非常爽的,哗啦哗啦的往下写,很少会去考虑数据类型这件事。

变量类型注解

你定义一个变量a,赋值为1,那么它的变量类型就是整数,你定义一个变量b,赋值为1.0,那么它就是一个浮点数。你甚至在后期有需要的时候将字符串赋值给a。

但是由此带来的问腿就是,动态语言一时爽,代码重构火葬场。

在一段时间过去以后,你对之前写的代码不满意,需要进行重构的时候,你就会头大如钟。你仅看代码根本不知道这个变量是啥,它的数据类型是什么?不记得了!它有哪些方法?不记得了!你需要一层一层的网上找,找到变量定义的时候或者说数据类型改变的时候,这是一个非常难受的事情。那么有没有什么办法提高代码可读性和降低代码重构的难度?当然有,那就是我们今天要聊的类型注释,或者叫类型注解都可以

在我们定义变量的时候,对变量的类型进行注解,我申明了一个变量c,他的类型是整数,那么在接下来对变量a进行修改的时候,如果你将字符串赋值给变量c,那么编辑器就会提示了应为类型 'int',但实际为 'str' ,你就会注意到这个问题。

那么我就非要改变变量c的数据类型呢?当然可以,你再加上一个类型注解不就好了,我告诉你了,c的变量类型改变为字符串了。这样你在后期看代码的时候就能很明晰的知道一个变量的数据类型了.

如果我就不添加这个类型注解呢?难道我代码就不能运行,就报错。当然不会,类型注解仅仅是在语法层面的支持,对于代码的运行没有任何影响,Python的解释器在运行代码的时候会忽视类型注解。

a = 1
print(type(a))

b = 1.0
print(type(b))

a = "111"
print(type(a))

c: int = 1
print(c)

c: str = "aaa"
print(c)

函数形参类型注解

除了在变量类型声明的时候会用到类型注解,函数传参的时候同样会用到。

举一个栗子,我定义了一个求和函数,传入三个数字,返回三个数字的和。但是我传参的时候传入了三个字符串,在编辑器里是不会有任何警告或者报错的。

def three_sum(a, b, c):
    return sum([a, b, c])
print(three_sum(",", "q", "A"))

但是你一运行就报错了,提示数字和字符串不能进行+操作

TypeError: unsupported operand type(s) for +: 'int' and 'str'

因此我们在定义函数的时候就可以进行形参的类型注解

def three_sum(a: int, b: int, c: int):
    return sum([a, b, c])

当我们尝试传入三个字符串的时候,编辑器就有了警告应为类型 'int',但实际为 'str'

这样我们就在写代码的过程当中避免了一些错误。

编辑器代码提示优化

上面光说了对以后看代码重构有好处,减少代码运行时的错误有好处,那我写代码就麻烦了,我不在乎以后,我只在乎现在,代码注解对我写代码的过程当中有什么好处嘛?

当然也是有的,那就是类型注解可以帮助编辑器依靠类型检测来静态分析你的代码,并给出代码提示

下面的代码在编辑器内是没有任何报错的,但是运行的时候就会报错了

AttributeError: 'NpzFile' object has no attribute 'item'. Did you mean: 'items'?

import numpy as np

test = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
test1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

np.save('data.npy', test)
np.savez('data.npz', test, test1)
data: np.ndarray = np.load('data.npy')
print(type(data))
data.resize((2, 5))

data1 = np.load('data.npz')
print(type(data1))
data1.resize((2, 5))

不对啊,我明明时照着编辑器的代码提示写的啊,这编辑器的代码提示是什么垃圾!你看它明明提示我data1时有resize方法的

问题出在哪呢?np.load函数返回值的数据类型不是固定的,读取npy文件返回的就是ndarray对象,读取npz文件返回的就是NpzFile对象,因此编辑器给出的代码提示也就不是那么正确.

编辑器不知道返回的数据类型,我们不是知道嘛,因此我们可以帮助编辑器去分析变量类型,也就是对变量的类型进行注解,这样编辑器就能给出正确的代码提示

总结一下类型注解的好处:

  1. 使用类型提示,尤其是在函数中,通过类型提示来明确参数类型和所产生结果的类型,非常便于阅读和理解。

  2. 类型提示消除了认知开销,并使代码更易于阅读和调试。考虑到输入和输出的类型,你可以轻松推断对象以及它们如何调用。

  3. 类型提示可改善代码编辑体验。IDE 可以依靠类型检测来静态分析你的代码并帮助检测潜在的错误(例如,传递错误类型的参数、调用错误的方法等)。另外,还可以根据类型提示为每个变量提供自动补全。

最后建议大家可以去看一下typing这个库,它属于python的标准库,可以更好的帮助你使用类型注解,实现除了基本数据类型意外更复杂的类型注解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丨水木旦丨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值