这个新方法,竟然能检测 Python 代码的好坏!

整理 | 王晓曼

出品 | CSDN(ID:CSDNnews)

我爱linters!linter是在不运行代码的情况下查找代码中问题的程序。在代码库上运行一个检查程序,看到一长串的警告和错误,这是一件令人高兴的事情,有时甚至可以很有趣地修复它们!

许多程序员讨厌检查程序,他们会寻找任何理由来忽略它们。他们会说“有太多的假阳性!”和“有太多的假阴性!”等借口。但从根本上说,问题在于程序员不喜欢自己的代码被批评,也不喜欢别人告诉他们该做什么。

好吧,糟糕的是,因为我最近在 Python linter Pylint 中添加了两个非常固执的检查器。这些检查器太固执己见,它们不是默认打开的——而是必须手动启用的扩展。
在这里插入图片描述
图源:CSDN付费下载自视觉中国

consider-ternary-expression

考虑以下代码块:

if condition ():x = 4else:x = 5

代码块是做什么的?显然,它根据 condition() 的值给变量 x 赋一个或另一个值,这是块的自然语言描述,它只是一条语句。但是代码本身要比一个语句复杂得多:它是一个if -语句,每个子块中都有一个 assign 语句。

一般来说,代码越少越好,这个代码块可以被更简洁地重写如下:

x = 4 if condition () else 5

只有一个声明!没有混乱,没有混乱。实际上,如果默认启用这个检查,会有很多麻烦。Python 程序员通常不喜欢 if 表达式,也就是“三元”运算符。Lisp 使用 if 表达式,一切都很好:

( setq x (if(condition ) 4 5))

总之,这只是个风格问题。它不会以一种有意义的方式影响程序的正确性或结构。检查仅在示例中给出的特定环境中触发。例如,如果有 if- eliifelse 块或嵌套的 if- 语句,它就不会触发。

while-used

下一个检查更为彻底:它无条件地标记每次使用 while 表达式。

“天哪,”我听到你说。“我怎么能在不使用 while 的情况下写代码呢?接下来是什么?没有 if ?没有 def ?这是多么荒谬和毫无意义的限制啊!”

这就是前面提到的那种胆小的反应。

但事实是:大多数代码都不够复杂,不足以保证 while 循环,而大多数 while 循环最好写成 for 循环。这就是事实,你需要认真对待它。

这不是每个 while 循环的情况,但对大多数循环都是这样。以下是一些例外:

  • 顶级应用程序驱动程序;
  • 只要用户说它应该运行,它就会一直运行;
  • 定理证明和编程语言解释器;
  • ???

while 循环引入了无限计算。你的网页应用真的需要无限计算吗?我对此表示怀疑。几乎在所有情况下,循环都可以预先限定,如“do this N times”或“do this for this list 中的每一项”。这些循环保证会终止,这是一个很好的保证!

如果你有一个 while 循环,而你的工作不需要无限计算,那么很有可能它可以被更清楚地重写为 for 循环。对 Pylint 代码库本身运行这个检查,我被出现的一些 while 的可怕之处震惊了。它们不可能全部被重写,但很多可以。

即使是最近发现的 Beeping Busy Beaver 冠军程序也只使用一个无限 while 循环,这是一种由顶级程序驱动的。

你知道还有什么没有无限循环吗?Excel。所有用 Excel 处理的金钱问题都是通过有界循环来完成的。

最终,大多数代码处理的函数都是原始递归的,对于这些应用程序,可以完全从语言中删除。真正的无边界循环对于一般递归和不可计算的函数是必需的,而普通的程序员和科学家不会处理这类事情。

参考链接:
https://nickdrozd.github.io/2021/09/02/new-pylint-checks.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值