五大代码异味:你需要提高警惕了
全文共2456字 , 预计学习时长7分钟
本文插图
图源:unsplash
作为广泛应用的警告标志 , 与字面意思不同 , 代码异味并不是指代码中需要立即注意的漏洞 。 相反 , 它反映出代码中更深层次的问题 , 更确切地说是代码中的裂缝 , 如果不加以纠正 , 这些问题可能会在未来导致更严重的后果 。
代码异味是弱点或设计缺陷的标志 , 可能会在可读性、可维护性和可拓展性上导致问题 , 通常是由不当做法和未使用正确的工具导致的 。
Python是最流行的语言之一 , 这在很大程度上与其相当容易的学习曲线和高度伪英语句法有关 , 而这却容易令人陷入单一的做事方法 。 本文中 , 我们将了解一些典型的Python代码异味案例以及如何避免它们 。
可变默认参数
在Python中 , 使用默认参数是一个很常见的操作 , 你可以设置一个预定值 , 并在调用时选择更改 。 这在设置文字、数字或布尔值时很有用 , 因为有助于避免出现较长的有冗余值的参数列表 。
但是将可变的值设置为默认参数可能是危险的 , 并且会导致bug 。 来看以下示例:
def addElements(a=[]): a.append(5) return aaddElements() # [5] addElements() # [5, 5]
相同的函数在每次调用时给出不同的结果 。 Python中可变默认值的问题是它们只在定义函数时计算一次 。 每次调用函数时 , 使用变异值 , 可能会导致意外的问题 , 因为跟踪函数调用真的很麻烦 。
因此 , 使用None作为默认值 , 并在函数中分配可变变量是更安全的 , 因为你不会以可维护性问题结束 , 只有在确定需要时才使用可变的默认参数 。
选择 `range` 而不是`enumerate`
Python的for循环不是最常用的代码编写方式 , 但有时也会需要到 。 现在 , Python中的for 循环的运行与其他语言不同 , 你可能会本能地以非惯用的方式编写传统风格的range(len()) , 如下所示:
names =[''a'', ''b'', ''c'']for i in range(len(names)): print(i, names[i])
重复基于C-style索引的循环是相当常见的 , 但这是一种不当做法 。 其迫使你通过显式索引变量访问元素 , 所以它不仅Python特性不明显 , 而且还存在可读性问题 。
使用enumerator能提供一个元组的优势 , 该元组负责同时跟踪索引值和元素 。 除了更简便 , 优化程度还更高 , 它还提供了可选的第二个参数来设置数值 。
for i, name in enumerate(names): print(i, name)
忽略内置函数和过度循环
循环不是不能用 , 但在其中应用转换操作时 , 它可能会导致冗长的条件代码 。 在这种情况下 , 不要忽略已经可以使用的内置函数 , 如map()filter()和reduce() , 这是非常重要的 。 更重要的是 , Python提供了列表解析 , 这显然是最具Python特性的替换循环方法 。
嵌套for循环是代码异味的另一个典型例子 。 Python程序员在进行模式匹配或一起运行多个迭代时很容易中枪 。 下列代码一旦再加几行就会看起来不美观:
for x in listA: for y in listB: r.append((x, y))
使用itertools不仅可以提高性能 , 还更简洁明了 。 看看上面的代码在itertools.product()中有多整洁:
for x, y in itertools.product(listA,listB): r.append((x, y))
通过使用上面的product , 也可以很容易地将其传递到其他高阶函数中 。 同时在多个列表上同时迭代时 , 使用zip()函数也不错(如需索引 , 还可以使用enumerator) 。
滥用列表解析
列表解析能灵活创建列表 , 功能强大 , 但很容易被误用或滥用 , 来看一些案例 。
· 在不需要时过度进行列表解析
通常 , 我们开始沉迷于使用列表解析是为了尝试花哨的东西 , 而不是真需要它 。 比如在简单的情况下可以使用列表构造函数:
推荐阅读
- 【】体坛观察丨仓促收官的五大联赛,短暂却不失精彩
- 体坛小跟班|莱万最冤,梅西第五,C罗让人意外,五大联赛射手榜去掉点球
- 封面新闻|30秒|欧洲五大联赛全部结束 8月8日静待欧冠
- 中储粮|邻居闻到出租屋里传出异味,房东进屋发现年轻情侣已经死亡多日
- 第五大道|大规模示威持续不止,政坛常青树的陨落:卢卡申科遭遇信任危机
- 第五大道|多处哨所被摧毁,边境再现激烈交火!印军阵地遭大口径炮火覆盖
- 江苏卫视|每一幕都让人念念不忘,本季《最强大脑》五大意难平场面
- 代古龙|西甲149粒,1队赛季0点球,五大联赛点球数排名:意甲187粒
- 代古龙|C罗第3梅西第5名,19/20赛季五大联赛射手榜:因莫比莱称王
- 轻拔琴弦|Reactor如何规定,混淆保护需正确命名!看.NET代码保护工具.NET
