浅析 Python 中的 9 种常见反模式

81 天前
 zywscq

小小总结如下:

  1. For-else 语法:除了 Python 没见过其他语言可以这么写。。。
  2. eval()/exec()函数:用于生产环境不安全
  3. 多重嵌套的循环
  4. from module import *
  5. 写复杂的 one liner
  6. OOP 过于复杂的继承关系链
  7. 用可变对象做默认参数
  8. 太多 if-else ( 3.10 版本之后可以写 match-case 了)
  9. 还使用 C 语言的风格去格式化字符串

英文原文链接: https://levelup.gitconnected.com/9-python-anti-patterns-that-i-will-never-apply-in-production-dd6f3d1e4b42?sk=50cc6efa8a7e4f4ee5b98789ea4a8381

2329 次点击
所在节点    Python
16 条回复
vituralfuture
81 天前
9 python 也能搞嵌入式,对嵌入式工程师来说 c 风格的格式化更容易使用,而且 c 风格格式化应该是从 python2 就有的
eagleoflqj
81 天前
1 不同意,我还想其他语言怎么就没有呢
henix
81 天前
如果是很重要的反模式,可以找找有没有 linter 能检查出来
woodfizky
81 天前
你没把这篇文章本身就主观的标题也翻译过来,人家是《我在生产中不会用的 9 种反模式》,突出一个主观。
部分观点你也总结的不对。

1 ,原作者确实说其他语言没见过这样的语法,但是只是说其他并非熟悉 Python 的同事在维护 for-else 代码时会困惑,并且下面给出了一段不用 for-else 的 Python 代码,你看那段代码就知道 for-else 比其他语言还要自己写个 flag 的好处在哪里了,本身 for-else 是好东西;

3 ,作者意思是 python 中有更优雅的多重嵌套循环实现方式;

6 ,用 OOP 语言写的代码,继承链过长不是 OOP 语言的错,是开发者的错;

7 ,别的 IDE 不清楚,PyCharm 用可变对象做默认参数,IDE 会提示告警的;

9 ,原文是还兼容 C 风格的字符串格式化方式,但是后面有这么一句话:
We should avoid this old technique now and apply the f-string syntax for all string formatting in Python ;

Python 现在有 fstring 了,fstring 之前也有.format ,C 风格的字符串格式化很少见到有同事用了,顶多用 format 方法,或者更笨的字符串相加。。作者呼吁用新特性,这点是没毛病的。
paopjian
80 天前
这文章没法看啊,还得订阅?
marcong95
80 天前
原文是 I will never apply 你翻译一下就变成了「常见」的反模式。。。

2~8 应该其他语言都是不建议使用的吧,也不是只是 Python 会有的问题
est
80 天前
还使用 C 语言的风格去格式化字符串


C 语言风格挺好的。我就问你 logging 模块怎么搞

官方也是一刀切去掉,结果又灰溜溜加回来 https://peps.python.org/pep-0461/

.format() 和 fstring 最讨厌的死脑筋类型 f'{1.1:d}' 不成功,'%d' % 1.1 是可以的。本来就是随手打印一下,这下得多写好多行 if 一下类型。
est
80 天前
另外个人方案 match-case 。有 elif 为啥还要这玩意?除了搞语法花样没有任何收益,屎上雕花。以前的 There should be one-- and preferably only one --obvious way to do it 是被吞了吗
est
80 天前
个人方案 -> 个人反感
NoOneNoBody
80 天前
每件事都有两面

python 包很多很好很方便,就是类型太多了
但我昨天花了四小时在排除“类型不符”的问题,数据准确性和代码逻辑都没问题,最后就是在十几个地方加上指定类型的参数就过了
Alias4ck
80 天前
为什么我觉得 one line 很酷,但是实际开发我不推荐
stimw
80 天前
我很讨厌别人写 one line 然后说这是 phthonic
skywalker1014
80 天前
for-else 这个好用啊,就算看不懂也一学就会
Maerd
80 天前
@Alias4ck
@stimw
Zen of Python 中明有说
Beautiful is better than ugly.
Simple is better than complex.
Sparse is better than dense.
实际开发中也就是生成式和 lambda 会写 one line ,其他的说这是 phthonic 一律认为是犟嘴。
Alias4ck
80 天前
@Maerd 但是有时候做题就很想 one line 啊 你不觉得很爽吗
zywscq
80 天前
@eagleoflqj for-else 这个语法真的很独特,用熟悉了可能比较方便,但是不知道的就完全看不明白。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1016388

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX