社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

最令人沮丧的python黑客是什么?

Bialecki • 5 年前 • 1590 次点击  

我对python的印象是,在我开发python的短短时间里,它的强大和灵活令人难以置信,但我不禁觉得“强大的力量带来伟大的责任”。因此,尽管我读了很多关于简单优雅的python代码片段的博客文章,这些代码片段可以解决一个问题s,我想知道是否有设计模式或滥用python语言特性,一旦构建到应用程序或库中,会导致代码异常脆弱,几乎不可能重构。

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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40494
 
1590 次点击  
文章 [ 6 ]  |  最新文章 5 年前
Andy Rose
Reply   •   1 楼
Andy Rose    8 年前

我遇到的最大问题是使用双前导下划线属性。犯罪者实际上是新的Python程序员或程序员,他们喜欢另一种语言(特别是Java,出于某种原因)。双领先下划线导致属性被名称损坏(使用当前类名),避免子类中的冲突。它经常被视为“私有”,尽管它不是。 this answer I once wrote )相同的类通常到处都是访问器(不是属性,而是直接调用的常规方法),以获取这些名称混乱的属性。最终的结果总是一个令人毛骨悚然的复杂类,无法对其进行子类化以进行专门化、错误修复、monkeypatch或测试。

Blumer
Reply   •   2 楼
Blumer    15 年前

…什么是最令人沮丧的,但有点常见的,python“黑客”或语言功能滥用,有人可以介绍,这将导致噩梦的未来维护者的代码?

难以重构:

嵌套列表理解 (如在:多层深)。

大多数人(在学习python时)都对列表理解的强大功能和实用性着迷。这可能会导致过度使用它们并构建嵌套很深、复杂的组件。大多数时候,为了可读性和可维护性,相同的代码应该使用简单的循环来编写。我认为三个层次已经嵌套得太深了。

——

而且(重构起来并不难,但最让人恼火的是):

试图像使用python一样使用它 另一个 语言 (没有自己的特定结构);例如:

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

这包括:当功能已经(恰当地命名)在富标准库中时(糟糕地)重新发明轮子。

还有类型检查,使东西无法子类化等等…

Mark Rushakoff
Reply   •   3 楼
Mark Rushakoff    15 年前

这不是一个黑客,但是Python2.x有一个很大的问题 print 关键字。

人们会依赖 打印 在整个项目中调用输出,然后当最终需要将输出更改为文件时 为了标准输出,他们必须进去重构所有的打印文件 关键词 到另一个自定义输出函数。

python 3通过使 打印 实际的函数而不是关键字(因此自动生成输出 松散耦合 对于系统的其他部分),因此如果需要,可以替换原来的 打印 带着新的 打印 这不仅仅是给stdout写信。

PEP3105 对于来自guido的具体推理和更多细节。

unutbu
Reply   •   4 楼
unutbu    15 年前

使用 eval exec 对用户输入可能是最常见的滥用python特性。

jfs
Reply   •   5 楼
jfs    15 年前

但并不总是有效的魔法。例如,当元类被滥用来创建dsl时。这样的dsl可以适用于大多数任务,但在复杂的(作者意想不到的)任务上会出现可怕的中断。

Denis Otkidach
Reply   •   6 楼
Denis Otkidach    15 年前

过度使用 from module import * .

在模块中有很多这样的导入,您不知道每个变量来自何处,必须查看所有导入的模块。在这种情况下,搜索没有多大帮助。