principles

Beautiful is better than ugly.
优美优于丑陋。

Explicit is better than implicit.
明了优于隐晦。 (显式优于隐式)

Simple is better than complex.
简单优于复杂。

Complex is better than complicated.
复杂优于凌乱。 (这里的complex指逻辑复杂但有序,complicated指难以理解的混乱)

Flat is better than nested.
扁平优于嵌套。

Sparse is better than dense.
稀疏优于稠密。 (指代码行数多、留白多比挤在一行更难出错)

Readability counts.
可读性很重要。

Special cases aren't special enough to break the rules.
特例也特殊不到打破规则的程度。

Although practicality beats purity.
然而,实用性胜于纯粹性。

Errors should never pass silently.
错误永远不应该被无声地忽略。

Unless explicitly silenced.
除非你明确地要求忽略它们。

In the face of ambiguity, refuse the temptation to guess.
当面对模棱两可的局面时,拒绝猜测的诱惑。

There should be one-- and preferably only one --obvious way to do it.
应该有一种——最好只有一种——显而易见的方法来做这件事。

Although that way may not be obvious at first unless you're Dutch.
然而,除非你是荷兰人(指Python之父吉多·范罗苏姆),这种方法一开始可能并不那么显而易见。

Now is better than never.
现在做胜过永远不做。

Although never is often better than *right* now.
然而,永远不做常常比现在(没想清楚就)动手更好。

If the implementation is hard to explain, it's a bad idea.
如果实现很难向别人解释清楚,那通常是一个坏主意。

If the implementation is easy to explain, it may be a good idea.
如果实现很容易解释清楚,那可能是一个好主意。

代码规范/代码风格的一致性

  • 与此风格指南保持一致很重要。
  • 项目内的一致性更重要。
  • 一个模块或函数内的一致性最重要。

代码被阅读的次数远比被编写的次数多,所以可读性很重要。

tips

风格的舍断离:但其实针对相同的情况,每个人有每个人的标准。

  • 所以为了可读性应忽略某些风格。
  • 和已经存在的代码保持一致。
  • 没有理由修改时。
  • 旧版本python等兼容性考虑。

代码布局

缩进

  • 每个缩进级别使用 4 个空格。制表符应仅用于与已经使用制表符缩进的代码保持一致。
  • Python 3 不允许混合使用制表符和空格进行缩进。 混合使用制表符和空格缩进的 Python 2 代码应转换为仅使用空格。
  • 续行应使用括号()、[]、{}内的 Python 隐式行连接(垂直对齐包裹的元素),或使用悬挂缩进(建议为4空格)。
  • Python 标准库是保守的,要求将行限制为 79 个字符(文档字符串/注释限制为 72 个字符)。如果团队有需要且达成统一意见,可以自定义行长度。
# 与开始定界符对齐。
foo = long_function_name(var_one, var_two,
var_three, var_four)

# 包含更多缩进以将其与其余部分区分开。
def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)

# 悬挂缩进应增加一个级别。
foo = long_function_name(
var_one, var_two,
var_three, var_four)


# ps: 目前浏览器中使用快捷键缩进样例 Ctrl + Alt + L/Command + Option + L
# 在条件续行上添加一些额外缩进。
if (this_is_one_thing
and that_is_another_thing):
do_something()

# hang closing brackets:

my_list = [
1, 2, 3,
4, 5, 6,
]
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)

# 也可以 自定义配置
my_list = [
1, 2, 3,
4, 5, 6,
]


# 应优先使用上述方法,而不是使用反斜杠进行行连接。
# 有时反斜杠可能仍然合适。例如,长的多个 with 语句不能使用隐式续行

with open('/path/to/some/file/you/want/to/read') as file_1, \
open('/path/to/some/file/being/written', 'w') as file_2:
file_2.write(file_1.read())


# 运算符和条件判断类似
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)

tips

# =
def complex(real, imag=0.0):
return magic(r=real, i=imag)

# ->
def munge() -> AnyStr: ...

空行

  • 顶层函数和类定义之间用两个空行隔开。
  • 类中的方法定义之间用一个空行隔开。
  • 可以使用额外的空行(少量)来分隔相关函数组。
  • 在函数中谨慎使用空行来指示逻辑部分。

tips —-文件编码和shebang

使用 ASCII(Python 2)或 UTF-8(Python 3)的文件不应有编码声明。

但实际使用时有时需要配置。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

tips—-import

导入应按以下顺序分组,每组导入之间放一个空行:

  • 标准库导入
  • 相关的第三方导入
  • 特定的本地应用程序/库导入

避免使用通配符和隐式导入

字符串

  • 单引号字符串和双引号字符串是相同的,选择一个日常使用
  • 当字符串包含引号时,使用另一种以避免字符串中的反斜杠,提高了可读性
  • 对于三引号字符串,始终使用双引号字符。【文档字符串】

naming

  • lowercase (小写)
  • lower_case_with_underscores (带下划线的小写)
  • UPPERCASE (大写)
  • UPPER_CASE_WITH_UNDERSCORES (带下划线的大写)
  • CapitalizedWords (首字母大写的单词 CapWords
    • 在 CapWords 中使用缩写时,请将缩写中的所有字母大写:HTTPServerError 优于 HttpServerError。
  • b (单个小写字母)
    • 局部变量避免使用o/l等和0/1易混淆的单字母
  • B (单个大写字母)

可读性比语法糖更重要

  • 推导式
    • squares = [x**2 for x in range(5)]
    • squares = {x: x**2 for x in range(5)}
    • squares = {x**2 for x in range(5)}
  • 条件表达式
    • numbers = [i if i % 2 == 0 else -i for i in range(10)]
    • numbers = [i for i in range(10) if i % 2 == 0]
  • with
  • 装饰器
  • 解构赋值
    • a, b = b, a
    • enumerate/zip
    • 和元组的区别(n/v|容器和操作)
  • 参数
    • *args, **kwargs
  • 切片
    • 最好不要同时使用多个参数,可读性非常差
    • L[-2::-2]
    • L[-2:2:-2]
    • L[2:2:-2]
  • 链式比较
    • 2 < count < 5
  • else
    • for/while循环中完整执行时,不执行,可将其中的break条件视为if
  • 匿名函数/lambda表达式

dict的get和[]的隐藏含义

host.get(host_id)   // 默认不知道有没有
rule[rule_id] // rule_id已存在,逻辑上确实应该存在