V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zywscq
V2EX  ›  Python

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

  •  
  •   zywscq · 315 天前 · 2638 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。

    小小总结如下:

    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

    16 条回复    2024-02-19 21:25:33 +08:00
    vituralfuture
        1
    vituralfuture  
       315 天前 via Android
    9 python 也能搞嵌入式,对嵌入式工程师来说 c 风格的格式化更容易使用,而且 c 风格格式化应该是从 python2 就有的
    eagleoflqj
        2
    eagleoflqj  
       315 天前 via iPhone
    1 不同意,我还想其他语言怎么就没有呢
    henix
        3
    henix  
       315 天前
    如果是很重要的反模式,可以找找有没有 linter 能检查出来
    woodfizky
        4
    woodfizky  
       315 天前   ❤️ 3
    你没把这篇文章本身就主观的标题也翻译过来,人家是《我在生产中不会用的 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
        5
    paopjian  
       315 天前
    这文章没法看啊,还得订阅?
    marcong95
        6
    marcong95  
       315 天前
    原文是 I will never apply 你翻译一下就变成了「常见」的反模式。。。

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


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

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

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

    python 包很多很好很方便,就是类型太多了
    但我昨天花了四小时在排除“类型不符”的问题,数据准确性和代码逻辑都没问题,最后就是在十几个地方加上指定类型的参数就过了
    Alias4ck
        11
    Alias4ck  
       315 天前
    为什么我觉得 one line 很酷,但是实际开发我不推荐
    stimw
        12
    stimw  
       315 天前 via Android
    我很讨厌别人写 one line 然后说这是 phthonic
    skywalker1014
        13
    skywalker1014  
       315 天前
    for-else 这个好用啊,就算看不懂也一学就会
    Maerd
        14
    Maerd  
       315 天前
    @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
        15
    Alias4ck  
       315 天前
    @Maerd 但是有时候做题就很想 one line 啊 你不觉得很爽吗
    zywscq
        16
    zywscq  
    OP
       315 天前
    @eagleoflqj for-else 这个语法真的很独特,用熟悉了可能比较方便,但是不知道的就完全看不明白。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1385 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:17 · PVG 01:17 · LAX 09:17 · JFK 12:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.