什么是令人沮丧的Python黑客放松,重写等?

时间:2010-04-15 16:48:57

标签: python

我在短时间内对Python的印象是,它具有令人难以置信的强大和灵活性,但我不禁感到“以强大的力量来承担巨大责任”。因此,虽然我阅读了许多关于解决问题的简单而优雅的Python代码段的博客文章,但我想知道是否存在设计模式或滥用Python语言功能,一旦内置到应用程序或库中,会导致代码非常脆弱并且几乎不可能重构。

所以问题基本上是什么是最令人沮丧,但有些常见的Python“黑客”或语言功能滥用,有人可以引入,这将导致该代码的未来维护者的噩梦?

6 个答案:

答案 0 :(得分:4)

魔法虽然有效,但并非总是如此。例如,当滥用元类来创建DSL时。这样的DSL可能适用于大多数任务,但在复杂的(作者意想不到的)上可以破坏。

答案 1 :(得分:4)

在用户输入上使用evalexec可能是最常见的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或测试。