Valuebai / awesome-python-io

Python十分钟入门指南/技术图谱,持续更新收集整理中,期待你的参与
MIT License
8 stars 1 forks source link

【规范】Python编程规范 #13

Open Valuebai opened 4 years ago

Valuebai commented 4 years ago

大公司规范

【知乎规范】强烈推荐:编码之前碎碎念(工程实践)https://python-web-guide.readthedocs.io/zh/latest/codingstyle/codingstyle.html

【Google规范】Google 开源项目风格指南:https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/contents/

【Python Code Style】https://docs.python-guide.org/writing/style/

【Python最佳实践指南!】https://pythonguidecn.readthedocs.io/zh/latest/

image

PEP 8列出了许多细节,有几条规则绝对应该遵守:

Python官方有一个PEP8:Style Guide for Python Code。https://www.python.org/dev/peps/pep-0008/ 采用一致的代码风格,有利于项目的多人协作和后续的修改维护工作。Brett Slatkin写的《Effective Python》的第2条列举了一些PEP8中绝对应该遵守的规则。列举其中的一些(语言表述上和内容上我略有修改,是直接从我自己的笔记中复制出来):

空白

命名

表达式和语句

Valuebai commented 4 years ago

比如处理excel报表等直接用pandas提供的函数非常方便,我经常看见还是有人自己写一堆恶心的处理函数而不用pandas。如果自己造轮子确保测试和文档,否则后续维护和上手会有很大成本。

Valuebai commented 4 years ago

用sentry等工具记录异常,有利于排查问题(能保存堆栈和现场信息)。切记不要轻易吞掉非预知异常,一旦出现问题不好排查,笔者之前维护的项目曾踩过坑,后来笔者引入了sentry排查问题方便很多。

Valuebai commented 4 years ago

如果一个类不继承自其它类, 就显式的从object继承. 嵌套类也一样.

Yes: class SampleClass(object):
         pass

     class OuterClass(object):

         class InnerClass(object):
             pass

     class ChildClass(ParentClass):
         """Explicitly inherits from another class already."""

继承自 object 是为了使属性(properties)正常工作, 并且这样可以保护你的代码, 使其不受 PEP-3000 的一个特殊的潜在不兼容性影响. 这样做也定义了一些特殊的方法, 这些方法实现了对象的默认语义, 包括 new, init, delattr, getattribute, setattr, hash, repr, and str .

No: class SampleClass:
        pass

    class OuterClass:

        class InnerClass:
            pass
Valuebai commented 4 years ago

每个导入应该独占一行

Yes: import os
     import sys

No:  import os, sys
Valuebai commented 4 years ago

Main

即使是一个打算被用作脚本的文件, 也应该是可导入的. 并且简单的导入不应该导致这个脚本的主功能(main functionality)被执行, 这是一种副作用. 主功能应该放在一个main()函数中.

在Python中, pydoc以及单元测试要求模块必须是可导入的. 你的代码应该在执行主程序前总是检查 if name == 'main' , 这样当模块被导入时主程序就不会被执行.

def main():
      ...

if __name__ == '__main__':
    main()
Valuebai commented 4 years ago

【命名规范】不知道怎么起名字,查询这个 https://unbug.github.io/codelf/

Valuebai commented 4 years ago

【在列表/集合/字典中查找一个项】 有时我们需要在集合体中查找。让我们看看这两个选择:列表和集合(set)。

用如下代码举个例子:

s = set(['s', 'p', 'a', 'm'])
l = ['s', 'p', 'a', 'm']

def lookup_set(s):
    return 's' in s

def lookup_list(l):
    return 's' in l

即使两个函数看起来完全一样,但因为 查找集合 是利用了Python中的集合是可哈希的 特性,两者的查询性能是非常不同的。为了判断一个项是否在列表中,Python将会查看 每个项直到它找到匹配的项。这是耗时的,尤其是对长列表而言。另一方面,在集合中, 项的哈希值将会告诉Python在集合的哪里去查找匹配的项。结果是,即使集合很大,查询 的速度也很快。在字典中查询也是同样的原理。想了解更多内容,请见 StackOverflow 。想了解在每种数据结构上的多种常见操作的花费时间的详细内容, 请见 此页面。

因为这些性能上的差异,在下列场合在使用集合或者字典而不是列表,通常会是个好主意:

集合体中包含大量的项 您将在集合体中重复地查找项 您没有重复的项 对于小的集合体,或者您不会频繁查找的集合体,建立哈希带来的额外时间和内存的 开销经常会大过改进搜索速度所节省的时间。