Python 除了 PEP 还有其他类似最佳实践类的图书/网站/资源么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
shayuvpn0001

Python 除了 PEP 还有其他类似最佳实践类的图书/网站/资源么?

  •  
  •   shayuvpn0001 Jul 1, 2021 2093 views
    This topic created in 1763 days ago, the information mentioned may be changed or developed.

    简单的需求用 Python 写起来是很爽,找找轮子,搜搜代码很快就能跑起来。然而一旦稍微做大了,对脚本稳定性有较高要求,对资源控制有较高要求,特别是和水平不同的人一起合作的时候,强迫症很容易被折磨的各种抓狂。想弄个规范或者最佳实践来约束一下,先举下面几个例子:

    1,如果想清空一个 List,较好的方法是 del myList[:],而不是 myList = [],后者只是给 myList 开辟了一个新的 List,原来的 List 还在内存中。
    2,访问一个文件的时候,一般使用下面的 f = open("welcome.txt"),然而更好的做法是 with open("welcome.txt") as f: ,这样文件会自动关闭。

    上面只是两个简单的例子,事实上涉及到文本编码,Python 2 和 3 版本,异常处理,多线程 /异步还有更多的需要注意的地方。灵活的好处是开发速度快,但同时也加大了后续的成本,真的是一把双刃剑。

    想问一下哪里还有这种类似的规范或者总结,目前我个人发现这类比较集中的总结性文档主要有:
    1,PEP
    2,Effective Python
    3,The Hitchhiker's Guide to Python
    4,模板方面:cookiecutter,PyScaffold 和 python-boilerplate

    各位还有其他推荐的么?

    Supplement 1    Jul 2, 2021
    第一个例子,我知道文件引用计数和垃圾回收,我的目的是在明确知道对象生命周期结束之后,主动进行回收。我们的很多脚本是在 512M 的 Linux 虚拟机里面跑的,while(true),主动处理我没觉得有什么问题。

    如果觉得这一点有争议那也无所谓,我本身不是 Python 为主,这个帖子也是抛砖引玉。
    ampedee
        1
    ampedee  
       Jul 1, 2021 via Android
    有本书叫 编写高质量代码:改善 Python 程序的 91 个建议,还有一本 python cookbook 可以看看。
    不过第一个例子的写法我确实从来没见过,等着它自动垃圾回收就好了
    no1xsyzy
        2
    no1xsyzy  
       Jul 1, 2021
    myList = [] 的话会自动回收的,目前来说 CPython 实现上仍然会在引用计数归零时强制触发回收。
    PEP 算不上「规范或者总结」
    pcbl
        3
    pcbl  
       Jul 1, 2021 via Android
    同楼上,第一个直接写 l=[]没问题
    xiaket
        4
    xiaket  
       Jul 1, 2021
    用 Python 的人更应该关注脚本可读性, 大多数情况性能什么的不是那么重要. 或者说追求性能用 Python 这个语言就目前来看就是走歪了.
    mimzy
        5
    mimzy  
       Jul 1, 2021   1
    不推荐《编写高质量代码:改善 Python 程序的 91 个建议》,作者的代码一点都不 Pythonic 。

    推荐《 Effective Python 》《 Fluent Python 》。翻过《 Robust Python 》,主要围绕 Type Hints 讲解,感兴趣也可以看看,推荐。最近在翻《 Modern Python Cookbook 》,感觉也还可以。不过现在的程序员也不在乎 Pythonc 了,能跑就行,不行就换语言,所以感觉俺也不用太执着了 = =
    Kilerd
        6
    Kilerd  
       Jul 1, 2021   1
    Fluent Python

    Python CookBook
    shayuvpn0001
        7
    shayuvpn0001  
    OP
       Jul 1, 2021
    @xiaket
    @mimzy

    可读性,是不是 Pythonic 其实都没放在第一位,性能也没有放在较高的优先级上,目前的主要想法是把脚本长期运行的稳定性放在第一位,然后是团队风格尽量统一。

    比如那个打开文件的例子。如果团队里来了新人,写出了 f = open("welcome.txt"),你说他写错了没?没有,但是这样的模块和其他老员工的组合到一起,就特别让强迫症受不了。你也不好批评新人,你批评他,他嘴上不说心里嘀咕着“大不了我 try except,finally 里面检查一下 f 是不是 none,不是我来个 f.close 就好了。每个人有每个人的风格嘛。” 如果我出了一个项目规范文档,那么我可以一开始就让新人学习一下,以后再出现这种,就能名正言顺给他否掉了。

    多人协作风格统一还是很重要的,最理想状态是代码看起来都像是一个人写的,后续维护成本会大幅减少。性能方面,能注意的尽量注意,代码长期运行的稳定性和可维护性还是放在第一位的。
    LeeReamond
        8
    LeeReamond  
       Jul 2, 2021
    @shayuvpn0001 兄弟别写后端了...这么简单的规范问题你都能写出来这么多字属实是人才,还能写出来团队里不服管的新人的例子,不如去做前端,多写技术博客,你会很有发展。
    deplives
        9
    deplives  
       Jul 2, 2021 via iPhone
    别扯没用的 就你写的第一个我就知道你的水平
    abersheeran
        10
    abersheeran  
       Jul 2, 2021
    楼上+1 。看到第一个例子我就觉得你压根不懂引用计数回收……建议先多看看再考虑给人定标准,不然你一定会被人骂。
    shayuvpn0001
        11
    shayuvpn0001  
    OP
       Jul 2, 2021
    @LeeReamond 我什么时候说了用 Python 写后端了?我本身也不是主要写 Python 的啊?

    Python 目前我们主要用来做 Excel 数据处理,做小工具,偶然用 Flask 做一些内部 Web 应用。后面考虑到跨平台,会把部分.Net 写的 Win 平台上的工具用 Python 重写。这部分工作以后会给实习生来做,所以才会想弄一套规范省得 Review 时候在这些细枝末节上面烦心啊。

    正因为以后 Python 比重会增加,才会有做一个内部规范的想法。如果有阿里的 Java 规范那种我就直接拿过来用了。

    @deplives 我知道文件的引用计数,Python 不是主力语言,水平有限抛砖引玉总可以吧。
    myCupOfTea
        12
    myCupOfTea  
       Jul 2, 2021
    myList = [] 明明就会自动回收 你说啥呢
    shayuvpn0001
        13
    shayuvpn0001  
    OP
       Jul 2, 2021
    @abersheeran 显式删除有什么问题?
    ynkkdev
        14
    ynkkdev  
       Jul 2, 2021   1
    Python 风格规范 Google 开源项目风格指南: https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/

    你说的第二点在这个指南里面也有提到,第一点确实不敢苟同
    abersheeran
        15
    abersheeran  
       Jul 2, 2021   1
    @shayuvpn0001 你的问题在于 myList = [] 本来没有问题,如果你说性能,它甚至比你的 del 还少一半的字节码。

    另外,我清空列表一般用 my_list.clear()。
    deplives
        16
    deplives  
       Jul 2, 2021   1
    @shayuvpn0001 https://docs.python.org/3/reference/simple_stmts.html#the-del-statement
    自己看看 del 的作用,别拿 del 和 c++里面的 delete 比较,半吊子水平就别自己搞一套规范了。真就骗骗实习生还行
    shayuvpn0001
        17
    shayuvpn0001  
    OP
       Jul 2, 2021
    @youngce 谢谢。
    qW7bo2FbzbC0
        18
    qW7bo2FbzbC0  
       Jul 2, 2021
    Pythonic 我认为更多是保证可读性吧
    zhuangzhuang1988
        19
    zhuangzhuang1988  
       Jul 2, 2021
    能用就行.
    www5070504
        20
    www5070504  
       Jul 2, 2021   1
    你想要的可能是 flake8 或者其他的静态代码分析

    flake8 好用, 连空行多个空格都能扫出来
    LeeReamond
        21
    LeeReamond  
       Jul 2, 2021 via Android
    @shayuvpn0001 水平差倒是无所谓,我建议你学写程序之前还是先写好语文吧。建议你仔细看看我的回帖,哪里有任何一丁点的字眼提到你是 python 技术栈的?也不知道你回了那么多字在回什么,啥都能长篇大论,人才
    About     Help     Advertise     Blog     API     FAQ     Solana     5507 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 90ms UTC 08:45 PVG 16:45 LAX 01:45 JFK 04:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86