V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
shayuvpn0001
V2EX  ›  程序员

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

  •  
  •   shayuvpn0001 · 2021-07-01 16:06:48 +08:00 · 1651 次点击
    这是一个创建于 1265 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简单的需求用 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

    各位还有其他推荐的么?

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

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

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

    Python CookBook
    shayuvpn0001
        7
    shayuvpn0001  
    OP
       2021-07-01 22:49:46 +08:00
    @xiaket
    @mimzy

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

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

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

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

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

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

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

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

    flake8 好用, 连空行多个空格都能扫出来
    LeeReamond
        21
    LeeReamond  
       2021-07-02 16:05:58 +08:00 via Android
    @shayuvpn0001 水平差倒是无所谓,我建议你学写程序之前还是先写好语文吧。建议你仔细看看我的回帖,哪里有任何一丁点的字眼提到你是 python 技术栈的?也不知道你回了那么多字在回什么,啥都能长篇大论,人才
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5325 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 06:56 · PVG 14:56 · LAX 22:56 · JFK 01:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.