Python 太糟糕了?开发者总结了 8 大原因

h4cd
 h4cd
发布于 2018年12月21日
收藏 46

有开发者发文表达了他觉得 Python 不行的 8 大原因

作者对每一项“缺点”都进行了分析,全文洋洋洒洒,概括起来 8 个原因分别是:

1、版本不兼容

Python 3 与 Python 2 不完全兼容。作者以 Perl 语言和创造了世界上早期个人电脑的 Commodore 为例,分析了缺乏向后兼容性和分离版本是如何导致失败的。

2、安装问题

运行 apt、yum 与 rpm 等工具可以获取并安装大多数软件包的最新代码,但是在使用 apt-get install python 或者 pip install python 安装 Python 的时候你不知道实际被安装的是哪个版本,而这可能与你所需要的代码不兼容。安装时需要指定 Python 版本。

3、缩进规则

乍一看,Python 代码似乎非常易读,但是在大型代码库中并不是这样。Pyhon 的四格缩进允许深度嵌套,但是嵌套太多层的话会导致代码在文本编辑器中换行,变得混乱。而长函数和长条件操作可能使得难以匹配语法的开始与结束。给调试带来了很大的困难。

4、代码导入方式

Python 的导入方式 import 允许引入整个模块、模块的一部分或模块中的特定函数。作者认为 Python 这种导入规则使得查找可导入的列表并不直观。C 中可以直接查看 .h 头文件,但是 Python 需要使用 python -v 列出引用所在位置,之后搜索该列表中每个目录和子目录中的每个文件。

此外,Python 的导入机制还允许用户重命名导入的代码,作者认为重命名模块非常适合小脚本,但是对于长程序来说真的很糟糕,因为它会影响代码的可读性和长期支持。

而更糟糕的地方在于,对于大多数语言来说,导入代码就只是导入代码,如果存在带有构造函数的全局对象,那么一些语言会执行代码,但这通常被认为是一种不好的做法。而许多 Python 模块在导入期间就运行初始化函数,这导致你不清楚什么正在运行,不知道它在做什么,需要花很多时间来追踪。

5、命名法

作者认为 Python 没有使用通用并且专业的术语描述语言本身。比如在其它所有语言中,数组都称为 arrays,但是在 Python 中,它被称为 lists;关联数组有时称为 hash(Perl),但 Python 称之为 dictionary。代码库命名方法也是这样,像 PyPy、PyPi、NumPy、SciPy、SymPy、PyGtk、Pyglet 与 PyGame 这些库,它们名称中的“Py”有时放在开头,有时又放在后边,没有统一。而类似 matplotlib、nose、Pillow 和 SQLAlchemy 的一些常见库甚至直接放弃了“Py”这种命名约定。

作者将 Python 描述为“具有可怕且不一致的命名约定的库的集合”。

6、怪癖

每种语言或多或少都有自己的怪癖,但是 Python 比其它语言都多。以字符串的操作为例,在 Python 中,单引号和双引号之间没有区别。但是,如果想要字符串跨行,则需要使用三引号 """string""" 或 ```string```;如果想使用二进制文件,那么需要使用 b'binary' 或 r'raw';有时需要使用 str(string) 将字符串转换为字符串,或使用 string.encode('utf-8') 将其转换为 utf8。

7、按对象引用传递变量

大多数编程语言都按值传递函数参数,但是 Python 默认使用 pass-by-object-reference 参数执行函数,这意味着更改源变量可能会使引用值改变。这是程序、函数和和面向对象编程语言之间的重大差异之一,如果每个变量都是通过对象引用传递的,并且对变量的任何更改都会在任何地方更改引用,那么可以直接使用全局变量来处理所有变量。但是全局变量的弊端是有目共睹的。

8、本地名称

gcc -o screencapture.exe screencapture.c -lscreencapture

假如在使用名为“libscreencapture.so”的 C 库测试截屏程序,可以调用自己的程序“screencapture.c”并编译成“screencapture.exe”。

但是在 Python 中这么做是不行的。Python 假定你首先要导入的是本地代码,那么如果你有一个名为“screencapture.py”的程序使用“import screencapture”,它将导入自己而不是系统库。

作者最后还表示,通常他会辩证地去评论一个东西,他觉得 Python 确实有一些不错的库,比如 BeautifulSoup、NumPy 和 TensorFlow,但是他真的没法列出关于 Python 其它好的方面,因为他真的认为 Python 很糟糕。

详情查看原文:https://www.hackerfactor.com/blog/index.php?/archives/825-8-Reasons-Python-Sucks.html

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:Python 太糟糕了?开发者总结了 8 大原因
加载中

精彩评论

行之予之
9、老子就看你不顺眼
Python是蛇,老子讨厌蛇。
这波天秀
这波天秀
别说了,先有java后有天,sb框架赛神仙
O
OSC_earWhA
我就特别不喜欢py的代码风格,好不自然
mojie126
mojie126
我也觉得用缩进控制块有点儿问题,尤其是好几层嵌套的那种...

难道是为了防止多层嵌套...?
helloclia
helloclia
感觉Rust解决了作者的这些问题!

最新评论(70

海子海子
海子海子
超级不喜欢py,简直像坨shi
izee
izee
反正我觉得用缩进来控制块是真的很蠢,至少我自己看写代码的时候非常难受,直接就放弃了
O
OS啊哒

引用来自“yak”的评论

为什么没有提GIL
他python都没有用过怎么会知道GIL全局锁
Keijack
Keijack

引用来自“mojie126”的评论

我也觉得用缩进控制块有点儿问题,尤其是好几层嵌套的那种...

难道是为了防止多层嵌套...?

引用来自“sxgkwei”的评论

缩进表示程序含义的方式,直接就把它否了。只能拿来做工具当极客,拿来做大型项目,呵呵了,维护的人得死。对计算机来说,其实缩进和 {} 表示块,基本没区别。但程序是给人看的啊,这种用看不到的字符表示了语义的,就是作,就是极客;不是堂皇大道。

引用来自“下里巴人_770728”的评论

带{}, 很方便重构时: 选择整个块, 然后整块移动; 从块首跳到块尾, 快速跳转 \
不太清楚python这样依赖缩进的语言, 是否方便 做到这两点呢?
我用VS Code,默认 格式化是 4 空格,需要重构块增加层级时,在插入那行比上一层级缩进2个空格,之后用快捷键进行格式化就行。
Ev4n
Ev4n
好了好了,php才是最好的语言~🐍
下里巴人_770728
下里巴人_770728

引用来自“mojie126”的评论

我也觉得用缩进控制块有点儿问题,尤其是好几层嵌套的那种...

难道是为了防止多层嵌套...?

引用来自“sxgkwei”的评论

缩进表示程序含义的方式,直接就把它否了。只能拿来做工具当极客,拿来做大型项目,呵呵了,维护的人得死。对计算机来说,其实缩进和 {} 表示块,基本没区别。但程序是给人看的啊,这种用看不到的字符表示了语义的,就是作,就是极客;不是堂皇大道。
带{}, 很方便重构时: 选择整个块, 然后整块移动; 从块首跳到块尾, 快速跳转 \
不太清楚python这样依赖缩进的语言, 是否方便 做到这两点呢?
O
OSC_cdFTqW

引用来自“红白机”的评论

其他都觉得还好吧。唯一觉得有点难受就是这个代码的缩进,代码长如果没有IDE智能提醒真的很容易搞乱。也有可能是开始学编程就习惯了{},有点先入为主的感觉。

引用来自“OSC_cdFTqW”的评论

@红白机 用python把代码写长,好好看看语言特性再说自己写过python
@OSC_cdFTqW 真正python代码是写不长的.
O
OSC_cdFTqW

引用来自“doula”的评论

所以大声告诉我。。。谁才是世界上最好的编程语言!!!
@doula python
O
OSC_cdFTqW

引用来自“红白机”的评论

其他都觉得还好吧。唯一觉得有点难受就是这个代码的缩进,代码长如果没有IDE智能提醒真的很容易搞乱。也有可能是开始学编程就习惯了{},有点先入为主的感觉。
@红白机 用python把代码写长,好好看看语言特性再说自己写过python
O
OSC_cdFTqW

引用来自“mojie126”的评论

我也觉得用缩进控制块有点儿问题,尤其是好几层嵌套的那种...

难道是为了防止多层嵌套...?
@mojie126 你的猜想是正确的,写出以上缺点其实很好笑,去import this,读一读python真言就懂了。
返回顶部
顶部