Ref: Python 风格指南 - 内容目录

这里主要记录一下值得注意的地方。

Python语言规范

Lint

    vsCode自带

导入

    完整路径

异常

    Ref: [Python] 07 - Statements --> Functions

    首先,自定义异常,基于“异常基类” class Error(Exception);

    其次,except捕获所有异常过于鲁莽;

    最后,鼓励使用finally执行“资源清理工作“。

全局变量

    避免使用,考虑下”类变量“来代替。

嵌套/局部/内部类或函数

    推荐使用!

    对“类中类”情况的序列化(pickled)带来问题。

列表推导(List Comprehensions)

    太复杂的还是考虑map, reduce, filter。

默认迭代器和操作符

    优先使用“省内存的迭代器方法";

生成器

    ”没有“缺点

Lambda函数

    适用于单行函数;

    对于常见的操作符,例如乘法操作符,使用 operator 模块中的函数以代替lambda函数。

条件表达式

    适合单行,例如 x = 1 if cond else 2

默认参数值

  默认参数只在模块加载时求值一次。如果参数是列表或字典之类的可变类型, 这可能会导致问题。

# 使用 None间接表达
def foo(a, b=None):
if b is None:
b = [] # 而不是直接用”可变类型“作为默认参数
def foo(a, b=[])

属性(properties)

    有必要替代setter getter。

True/False的求值

按直觉来讲,就是所有的”空”值都被认为是false。  

”布尔量“ 使用 is 或者 is not。

空列表就是None。

注意 is 和 == 的区别,如下:

>>> a = []

>>> a is []
False
>>> a == []
True

过时的语言特性

    有新的就用新的

词法作用域 (Lexical Scoping)

嵌套的Python函数可以引用外层函数中定义的变量,但是不能够对它们赋值。(鼓励使用)

i = 4
def foo(x):
def bar():
print i,
# ...
# A bunch of code here
# ...
for i in x: # Ah, i *is* local to Foo, so this is what Bar sees
print i,
bar()

函数与方法装饰器

最常见的装饰器是@classmethod@staticmethod,用于将常规函数转换成类方法或静态方法。

实例方法(普通方法)—————————随着实例属性的改变而改变

类方法(无论是类调用还是实例调用)——都是类属性的值,不随实例属性的变化而变化

静态方法———————————————不可以访问类属性,故直接输出传入方法的值

线程

    不要依赖内建类型的原子性。

威力过大的特性

Python是一种异常灵活的语言, 它为你提供了很多花哨的特性, 诸如元类(metaclasses), 字节码访问, 任意编译(on-the-fly compilation), 动态继承, 对象父类重定义(object reparenting), 导入黑客(import hacks), 反射, 系统内修改(modification of system internals), 等等.

优点:强大的语言特性, 能让你的代码更紧凑;

缺点:使用这些很”酷”的特性十分诱人, 但不是绝对必要. 使用奇技淫巧的代码将更加难以阅读和调试. 开始可能还好(对原作者而言), 但当你回顾代码, 它们可能会比那些稍长一点但是很直接的代码更加难以理解;

结论:在你的代码中避免这些特性.

Python风格规范

分号:不要

行长度:80 chars at most;括号就有隐式连接属性。

括号:宁缺毋滥

缩进:四个空格

空行:两行和一行两种模式

空格:照旧即可

Shebang:main文件写 #/usr/bin/python3

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

class OuterClass(object):
  class InnerClass(object):
    pass

字符串

免在循环中用+和+=操作符来累加字符串. 由于字符串是不可变的, 这样做会创建不必要的临时对象, 并且导致二次方而不是线性的运行时间。

在循环结束后用 .join 连接列表,一次性连接成一个字符串。

items = ['<table>']
for last_name, first_name in employee_list:
  items.append('<tr><td>%s, %s</td></tr>' % (last_name, first_name))
items.append('</table>')
employee_table = ''.join(items)

文件和sockets:使用with...as

导入格式:每个导入应该独占一行;完整包路径按字典序排序, 忽略大小写。

语句:通常每个语句应该独占一行

控制访问:可考虑属性(property)

命名

命名约定

1. 所谓”内部(Internal)”表示仅模块内可用, 或者, 在类内是保护或私有的.

2. 用单下划线(_)开头表示模块变量或函数是protected的(使用from module import *时不会包含).

3. 用双下划线(__)开头的实例变量或方法表示类内私有.

4. 将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.

5. 对类名使用大写字母开头的单词(如CapWords, 即Pascal风格), 但是模块名应该用小写加下划线的方式(如lower_with_under.py). 尽管已经有很多现存的模块使用类似于CapWords.py这样的命名, 但现在已经不鼓励这样做, 因为如果模块名碰巧和类名一致, 这会让人困扰.

Python之父Guido推荐的规范
Type Public Internal
Modules lower_with_under _lower_with_under
Packages lower_with_under  
Classes CapWords _CapWords
Exceptions CapWords  
Functions lower_with_under() _lower_with_under()
Global/Class Constants CAPS_WITH_UNDER _CAPS_WITH_UNDER
Global/Class Variables lower_with_under _lower_with_under
Instance Variables lower_with_under _lower_with_under (protected) or __lower_with_under (private)
Method Names lower_with_under() _lower_with_under() (protected) or __lower_with_under() (private)
Function/Method Parameters lower_with_under  
Local Variables lower_with_under  

Main函数

def main():
... if __name__ == '__main__':
main()

注释之美

  • TODO注释

# TODO(kl@gmail.com): Use a "*" here for string repetition.
# TODO(Zeke) Change this to use relations.
  • 文档字符串

绝不要描述代码。假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么。

一个文档字符串应该这样组织:

1. 首先是一行以句号, 问号或惊叹号结尾的概述(或者该文档字符串单纯只有一行)。

2. 接着是一个空行。

3. 接着是文档字符串剩下的部分, 它应该与文档字符串的第一行的第一个引号对齐。

Function

一个函数必须要有文档字符串, 除非它满足以下条件:

1. 外部不可见

2. 非常短小

3. 简单明了

def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):
"""Fetches rows from a Bigtable. Retrieves rows pertaining to the given keys from the Table instance
represented by big_table. Silly things may happen if
other_silly_variable is not None. Args:
big_table: An open Bigtable Table instance.
keys: A sequence of strings representing the key of each table row
to fetch.
other_silly_variable: Another optional variable, that has a much
longer name than the other args, and which does nothing. Returns:
A dict mapping keys to the corresponding table row data
fetched. Each row is represented as a tuple of strings. For
example: {'Serak': ('Rigel VII', 'Preparer'),
'Zim': ('Irk', 'Invader'),
'Lrrr': ('Omicron Persei 8', 'Emperor')} If a key from the keys argument is missing from the dictionary,
then that row was not found in the table. Raises:
IOError: An error occurred accessing the bigtable.Table object.
"""
pass

Class

class SampleClass(object):
"""Summary of class here. Longer class information....
Longer class information.... Attributes:
likes_spam: A boolean indicating if we like SPAM or not.
eggs: An integer count of the eggs we have laid.
""" def __init__(self, likes_spam=False):
"""Inits SampleClass with blah."""
self.likes_spam = likes_spam
self.eggs = 0 def public_method(self):
"""Performs operation blah."""

End.

[Advanced Python] 16 - Google style guide for programming的更多相关文章

  1. python 编程的 Style Guide

    Python 的作者既优雅又高冷又 鬼毛的 再 PEP8 里规定了 Python 程序编写规范.(风格和格式) 一.基本观念 1.可读性之上,代码被读的次数肯定比被写的次数多.因此作者十分重视代码的可 ...

  2. [Guide]Google Python Style Guide

    扉页 项目主页 Google Style Guide Google 开源项目风格指南 - 中文版 背景 Python 是Google主要的脚本语言.这本风格指南主要包含的是针对python的编程准则. ...

  3. [Guide]Google C++ Style Guide

    0.0 扉页 项目主页 Google Style Guide Google 开源项目风格指南 -中文版 0.1 译者前言 Google 经常会发布一些开源项目, 意味着会接受来自其他代码贡献者的代码. ...

  4. Google C++ Style Guide在C++11普及后的变化

    转 http://www.cnblogs.com/chen3feng/p/5972967.html?from=timeline&isappinstalled=0&lwfrom=user ...

  5. Google C++ Style Guide

    Background C++ is one of the main development languages used by many of Google's open-source project ...

  6. python coding style guide 的高速落地实践

    python coding style guide 的高速落地实践 机器和人各有所长,如coding style检查这样的可自己主动化的工作理应交给机器去完毕,故发此文帮助你在几分钟内实现coding ...

  7. python coding style guide 的快速落地实践——业内python 编码风格就pep8和谷歌可以认作标准

    python coding style guide 的快速落地实践 机器和人各有所长,如coding style检查这种可自动化的工作理应交给机器去完成,故发此文帮助你在几分钟内实现coding st ...

  8. Google Java Style Guide

    https://google.github.io/styleguide/javaguide.html   Table of Contents 1 Introduction 1.1 Terminolog ...

  9. Google Shell Style Guide

    转自:http://google.github.io/styleguide/shell.xml Shell Style Guide Revision 1.26 Paul Armstrong Too m ...

随机推荐

  1. Linux源码包安装apache(httpd)

    我这里实验是用的CentOS7 #事先先检查一下自己的linux是否安装apache [root@localhost ~]#rpm –q httpd #如果已安装则先卸载原来的apache [root ...

  2. JVM(十二):方法调用

    JVM(十二):方法调用 在 JVM(七):JVM内存结构 中,我们说到了方法执行在何种内存结构上执行:Java 方法活动在虚拟机栈中的栈帧上,栈帧的具体结构在内存结构中已经详细讲解过了,下面就让我们 ...

  3. SpringBoot进阶教程(六十一)intellij idea project下建多个module搭建架构(下)

    在上一篇文章<SpringBoot进阶教程(六十)intellij idea project下建多个module(上)>中,我们已经介绍了在intellij idea中创建project之 ...

  4. @Validated和@Valid区别

    注解地方 @Validated:可以用在类型.方法和方法参数上.但是不能用在成员属性(字段)上 @Valid:可以用在方法.构造函数.方法参数和成员属性(字段)上 两者是否能用于成员属性(字段)上直接 ...

  5. jar在linux上运行

    打jar后一直在linux远程的运行: nohup java -jar xxx.jar & CRT(打开时运行):(另外上传文件可使用“rz”命令,上传jar包) java -jar xxx. ...

  6. idea + springboot 的java后台服务器通过小米推送

    public class XiaomiPush { // 1.小米推送(我只推送Android且只应用regId发起推送,所以下面只有推送Android的代码 private static final ...

  7. HTML的发展及认识

    首先HTML全称是Hypertext Markup Language,它是一门超文本标记语言: HTML已经有了HTML2.0.HTML3.2.HTML 4.0. HTML4.01. HTML5几个阶 ...

  8. Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning)

    Leetcode之回溯法专题-131. 分割回文串(Palindrome Partitioning) 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. ...

  9. 噩梦(双向BFS)

    给定一张N*M的地图,地图中有1个男孩,1个女孩和2个鬼. 字符“.”表示道路,字符“X”表示墙,字符“M”表示男孩的位置,字符“G”表示女孩的位置,字符“Z”表示鬼的位置. 男孩每秒可以移动3个单位 ...

  10. crontab使用方法

    一.crontab基本用法 1.1 cron服务 cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下运行作业. service crond start //启动服务 service ...