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

2024-02-19 03:57:21 +08:00
zywscq  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

2704 次点击
所在节点   Python  Python
16 条回复
vituralfuture
vituralfuture
2024-02-19 04:25:41 +08:00
9 python 也能搞嵌入式,对嵌入式工程师来说 c 风格的格式化更容易使用,而且 c 风格格式化应该是从 python2 就有的
eagleoflqj
eagleoflqj
2024-02-19 04:59:43 +08:00
1 不同意,我还想其他语言怎么就没有呢
henix
henix
2024-02-19 08:30:19 +08:00
如果是很重要的反模式,可以找找有没有 linter 能检查出来
woodfizky
woodfizky
2024-02-19 09:02:15 +08:00
你没把这篇文章本身就主观的标题也翻译过来,人家是《我在生产中不会用的 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
paopjian
2024-02-19 10:14:53 +08:00
这文章没法看啊,还得订阅?
marcong95
marcong95
2024-02-19 11:29:41 +08:00
原文是 I will never apply 你翻译一下就变成了「常见」的反模式。。。

2~8 应该其他语言都是不建议使用的吧,也不是只是 Python 会有的问题
est
est
2024-02-19 12:00:04 +08:00
还使用 C 语言的风格去格式化字符串


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

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

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

python 包很多很好很方便,就是类型太多了
但我昨天花了四小时在排除“类型不符”的问题,数据准确性和代码逻辑都没问题,最后就是在十几个地方加上指定类型的参数就过了
Alias4ck
Alias4ck
2024-02-19 12:23:58 +08:00
为什么我觉得 one line 很酷,但是实际开发我不推荐
stimw
stimw
2024-02-19 12:26:50 +08:00
我很讨厌别人写 one line 然后说这是 phthonic
skywalker1014
skywalker1014
2024-02-19 13:08:42 +08:00
for-else 这个好用啊,就算看不懂也一学就会
Maerd
2024-02-19 17:14:21 +08:00
@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
2024-02-19 20:16:20 +08:00
@Maerd 但是有时候做题就很想 one line 啊 你不觉得很爽吗
zywscq
2024-02-19 21:25:33 +08:00
@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