这个新方法,竟然能检测 Python 代码的好坏!
Posted CSDN 程序人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这个新方法,竟然能检测 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
以上是关于这个新方法,竟然能检测 Python 代码的好坏!的主要内容,如果未能解决你的问题,请参考以下文章