我在短时间内对Python的印象是,它具有令人难以置信的强大和灵活性,但我不禁感到“以强大的力量来承担巨大责任”。因此,虽然我阅读了许多关于解决问题的简单而优雅的Python代码段的博客文章,但我想知道是否存在设计模式或滥用Python语言功能,一旦内置到应用程序或库中,会导致代码非常脆弱并且几乎不可能重构。
所以问题基本上是什么是最令人沮丧,但有些常见的Python“黑客”或语言功能滥用,有人可以引入,这将导致该代码的未来维护者的噩梦?
答案 0 :(得分:4)
魔法虽然有效,但并非总是如此。例如,当滥用元类来创建DSL时。这样的DSL可能适用于大多数任务,但在复杂的(作者意想不到的)上可以破坏。
答案 1 :(得分:4)
在用户输入上使用eval
或exec
可能是最常见的Python功能滥用。
答案 2 :(得分:4)
过度使用from module import *
。
在模块中有很多这样的导入,你不知道每个变量来自哪里,并且必须查看所有导入的模块。在这种情况下,搜索没有多大帮助。
答案 3 :(得分:3)
这不是一个黑客攻击,但Python 2.X的print
关键字存在一些问题。
人们会依赖print
在整个项目中调用输出,然后当它最终到达时,例如,将输出更改为文件和到stdout,我必须进入并重构所有打印关键字到另一个自定义输出功能。
Python 3通过使print
成为实际函数而不是关键字(因此自动使输出松散耦合到系统的其余部分)解决了这个问题,因此如果需要,您可以更换带有新print
的原始print
不仅仅是写入stdout。
有关Guido的具体推理及更多详情,请参阅PEP3105。
答案 4 :(得分:3)
..最令人沮丧的,但有些常见的Python“黑客”或语言功能滥用,有人可以介绍,这将导致该代码的未来维护者的噩梦?
难以重构:
嵌套列表推导(如:多层深度)。
大多数人(在学习Python时)对列表推导的力量和实用性着迷。这可能导致过度使用它们并构建深层嵌套,复杂的趋势。大多数情况下,相同的代码应该使用简单的循环编写,以提高可读性和可维护性。我认为已经嵌套了三个层次。
-
而且(不是很难重构,但主要是刺激性):
尝试使用Python,好像它是另一种语言(没有它自己的特定结构); e.g:
for i in range(len(mylist)):
item = mylist[i]
# do stuff with item
而不是
for i, item in enumerate(mylist):
# do stuff with item
甚至(为什么你还需要索引):
for item in mylist:
# do stuff with item
这包括:在富标准库中已经(恰当地命名)功能时重新发明轮子(非常糟糕)。
进行类型检查,使得东西不可能进行子类化等等......
答案 5 :(得分:2)
我遇到的最大问题是使用双引导下划线属性。肇事者几乎总是新的Python程序员或程序员,他们更喜欢另一种语言(特别是Java,出于某种原因。)双重前导下划线导致属性被命名为(使用当前的类名),避免了子类中的冲突。它经常被视为“私人”,即使它不是。 (参见this answer I once wrote。)相同的类通常包含访问器 - 不是属性,而是直接调用的常规方法 - 来获取这些名称受损的属性。最终的结果总是一个非常复杂的类,不可能将其子类化为专门化或错误修正或monkeypatch或测试。