五大代码异味:你需要提高警惕了!

IT科技2025-11-05 12:28:5188472

 本文转载自公众号“读芯术”(ID:AI_Discovery)。大代

作为广泛应用的码异警告标志,与字面意思不同,味需代码异味并不是提高指代码中需要立即注意的漏洞。相反,警惕它反映出代码中更深层次的大代问题,更确切地说是码异代码中的裂缝,如果不加以纠正,味需这些问题可能会在未来导致更严重的提高后果。

代码异味是警惕弱点或设计缺陷的标志,可能会在可读性、大代可维护性和可拓展性上导致问题,码异通常是味需由不当做法和未使用正确的工具导致的。

Python是提高最流行的语言之一,这在很大程度上与其相当容易的警惕学习曲线和高度伪英语句法有关,而这却容易令人陷入单一的做事方法。本文中,我们将了解一些典型的源码库Python代码异味案例以及如何避免它们。

可变默认参数

在Python中,使用默认参数是一个很常见的操作,你可以设置一个预定值,并在调用时选择更改。这在设置文字、数字或布尔值时很有用,因为有助于避免出现较长的有冗余值的参数列表。

但是将可变的值设置为默认参数可能是危险的,并且会导致bug。来看以下示例:

def addElements(a=[]):     a.append(5)     return aaddElements() # [5] addElements() # [5, 5] 

相同的函数在每次调用时给出不同的结果。Python中可变默认值的问题是它们只在定义函数时计算一次。每次调用函数时,使用变异值,可能会导致意外的问题,因为跟踪函数调用真的很麻烦。

因此,使用None作为默认值,并在函数中分配可变变量是b2b信息网更安全的,因为你不会以可维护性问题结束,只有在确定需要时才使用可变的默认参数。

选择 `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)。

滥用列表解析

列表解析能灵活创建列表,功能强大,但很容易被误用或滥用,来看一些案例。

(1) 在不需要时过度进行列表解析

通常,我们开始沉迷于使用列表解析是为了尝试花哨的东西,而不是真需要它。比如在简单的情况下可以使用列表构造函数:

names =["A","B","C"][x.lower() for x in names]#use this list(map(str.lower, names)) 

(2) 在实际不存储时使用列表解析

列表解析有助于轻松定义和创建列表,但它们始终存储于内存中。如果不使用系统进程,将有可能损害大数量的数据。因此,使用生成器表达式是更好的选择,因为它按需一次加载一个值。

嵌套分析也需要关注,因为这可能导致可读性问题,知道什么时候使用它,什么时候回退到for循环上是很重要的。

喜欢布尔标志参数和全局变量

布尔是最容易学习的数据类型。在Python中,提供命名参数使工作轻松得多。但是,它们很容易产生嵌套if else块的复杂代码并导致可读性问题。多个布尔存在隐藏的依赖关系,会产生一些问题。因而最好使用枚举,而不是多布尔逻辑。Enum数据类型是可扩展的,可以确保更好的代码结构。

全局变量在所有语言中都是麻烦的,Python也是如此。虽然有时我们确实需要使用它们,但将其误用作传递或访问数据的快捷方式可能很危险,因为它可变。

跟踪它的状态会很棘手,因为你永远不知道谁可能会改变它。如果开始到处使用全局变量,命名冲突则会导致命名空间受到不好的影响。

图源:unsplash

我们都见过代码异味,神秘的注释、多余的字符串文字和神奇的数字也算代码异味。在编写注释时,重要的是要说明“为什么”部分,因为“什么”部分应该从代码本身得到解释。

你得学会快速定位到代码异味并将其去除。

本文地址:http://www.bhae.cn/html/191b21299596.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

热门文章

全站热门

默认的,apt-get会连接http://us.archive.ubuntu.com/,看域名就知道这是一个美国的服务器。身处我们伟大的中华局域网中连美国的服务器当然很慢了。 这个软件源可以通过/etc/apt/sources.list修改,把找到的好软件源放到这个文件中即可从新的软件源安装软件。我以前也是用到了才到处找,今天发现不用那么麻烦,把其中的us.archive替换成cn.archive就可以使用中国的软件源了。 使用vi的替换方法: vi /etc/apt/sources.list 打开之后依次输入以下命令: 然后再输入apt-get update更新一下刚才修改的配置文件。以后再安装软件就非常快了。 http://cn.archive.ubuntu.com/这个源是SOHU在维护,搜狐还有另外一个域名(mirrors.sohu.com),此外网易也提供了镜像服务(mirrors.163.com)。修改方法是一样的,但是都不如这个直接把us改成cn简单。 感谢搜狐和网易 2011.9.29更新: 经测试搜狐的源(cn.archive.ubuntu.com、mirrors.sohu.com)是联通线路,电信服务器访问超级慢。 网易的源(mirrors.163.com)不知道是什么线路,但电信服务器访问超级快。

小米手机真假鉴别指南(如何辨别真伪,避免买到假冒产品)

探索Latitude系列(发现Latitude系列笔记本电脑的出色特性与优势)

ivvi小骨Pro手机体验报告(一款功能强大的智能手机值得拥有)

下载了Fedora 11 DVD ISO镜像文件,参考了XP下硬盘安装Fedora 10的方法,我把安装过程稍微整理一下供Linux新手参考。先看看Fedora的版本是Fedora 11了吧,见下图(图1),点击下图看大图。图1我电脑中原先安装的操作系统是Windows XP SP2,C盘是NTFS格式,F盘也是NTFS格式的。网上都说要把它放到fat32分区下,我现在把它放到了F盘(NTFS格式的),测试下可以的。我在F盘下新建了一个Fedora11目录,把Fedora-11-i386-DVD.iso里面的images文件解压出来放到刚才新建的fedora11目录中,另外再解压isolinux文件夹中的initrd.img和vmlinuz二个文件也放到fedora11目录下,把Fedora-11-i386-DVD.iso文件也放在fedora11目录中(见图2),还要把initrd.img和vmlinuz复制到C盘的根目录下。图2下载GRUB4DOS,我们只要里面的2个文件,解压后把grldr与menu.lst放到C盘根目录下。再修改menu.lst,在menu.lst最后加上title Install Fedora 11kernel (hd0,0)/vmlinuzinitrd (hd0,0)/initrd.img打开C盘的根目录,找到boot.ini,(通常虽隐藏的),在最后面加上c:grldr=GRUB重新启动系统,选择GRUB(见图3)。回车图3再选择最后的Install Fedora 11(见图4)就可以到安装界面了图4进入语言选择,中文用户选择见图5图5下一步应该是键盘布局的选择,默认好了,再下一步比较重要,选择安装方式,硬盘安装Fedora 11选中Hard drive(见图6)。图6这一步更重要,对于许多新手来说,不知道如何硬盘安装Fedora 11的关键所在,我把Fedora-11-i386-DVD.iso及相关安装文件都放在F盘的fedora11的目录中,所以要找到这里来,我的F盘是/dev/sda10分区 。假如你不知道,可以从/dev/sda1开始一个一个试过去,下面的地址也很重要,输入安装镜像文件所在的路径,/fedora11/images/install.img (见图7)。图7点击OK后就开始真正的安装,下面还有一个地方要注意,假如你想保留原来系统上资料,特别要注意下面的地方,要选择建立自定义分区结构。(见图8)下面就简单了,你自己看吧,假如还不懂,在下面的留言中提出。

超越牌锅炉的高效能和可靠性(让生活更舒适的超越牌锅炉)

以乐Pro3的性能和功能如何?(探索以乐Pro3的性能、功能和用户体验,为您提供详细的评估)

《大唐游仙记》(一部承载神秘与奇遇的传世之作)

热门文章

友情链接

滇ICP备2023000592号-9