44
44
45
45
<h4 id =" 1 " >简介</h4 >
46
46
许多工程项目都有自己独有的编码风格指南。如果发生任何规则冲突,当然是与项目级别的代码风格保持一致。美其名曰:入乡随俗,Do what Romans do in Rome,到了罗马就跟着吃马肉,生在唐朝就吃胖点。
47
+
47
48
<h4 id =" 2 " >愚蠢的一致性是小心灵的大地精</h4 >
48
- 代码风格一致性当然重要,毕竟读起来跟做spa一样爽,但有时也要有自己的判断,不要跟个傻X一样,明明是个90后,非得穿丝袜。
49
- 例如以下场景:
50
- 1、遵循此风格让你的那一小片代码看起来格格不入,清高的不行。
49
+ 代码风格一致性当然重要,毕竟读起来跟做spa一样爽,但有时也要有自己的判断,不要跟个傻X一样,明明是个90后,非得穿丝袜。
50
+
51
+ 例如以下场景:
52
+
53
+ 1、遵循此风格让你的那一小片代码看起来格格不入,清高的不行。
54
+
51
55
2、遵循此风格后和其他 python 版本不兼容,甚至出现错误。
56
+
52
57
<h4 id =" 3 " >代码布局</h4 >
58
+
53
59
<h5 id =" 3.1 " >缩进</h5 >
54
- 一个缩进级别四个空格。
60
+ 一个缩进级别四个空格。
61
+
55
62
* 连续行使用两种方式使封装元素成为一行:括号内垂直隐式连接和悬挂式缩进,使用悬挂式缩进应该注意第一行不应该有参数,连续行要使用进一步的缩进来区分。
56
63
57
64
``` Python
@@ -106,12 +113,17 @@ result = some_function_that_takes_arguments(
106
113
```
107
114
108
115
<h5 id =" 3.2 " >A罩杯还是C罩杯?</h5 >
109
- 除非项目中已经约定了使用 tab 作为缩进,最好使用 space。
116
+ 除非项目中已经约定了使用 tab 作为缩进,最好使用 space。
117
+
110
118
Python 3 不允许 tab 和 space 混用,同时混用了 tab 和 space 的 Python 2 代码应该被转换为仅使用 space。
119
+
111
120
<h5 id =" 3.3 " >代码行最大长度</h5 >
112
- 将所有行限制为最多79个字符。
113
- 对于具有较少结构限制(文档字符串或注释)的长文本块,行长度应限制为72个字符。
114
- 当然了,不要问为啥非得是 79,72。我们要兼顾非洲大陆人民的生活。代码是全世界的。
121
+ 将所有行限制为最多79个字符。
122
+
123
+ 对于具有较少结构限制(文档字符串或注释)的长文本块,行长度应限制为72个字符。
124
+
125
+ 当然了,不要问为啥非得是 79,72。我们要兼顾非洲大陆人民的生活。代码是全世界的。
126
+
115
127
反斜杠有时可能仍然要用。 例如,又多又长的 with - 语句不能使用隐式连接,这时反斜杠是可以接受的:
116
128
117
129
``` Python
@@ -121,8 +133,9 @@ with open('/path/to/some/file/you/want/to/read') as file_1, \
121
133
```
122
134
123
135
assert 语句也是如此。
136
+
124
137
<h5 id =" 3.4 " >在二元运算符之前还是之后断行?</h5 >
125
- 算法和程序设计技术先驱,计算机排版系统 TEX 和 METAFONT 的发明者 Donald Knuth,推荐使用以下形式:
138
+ 算法和程序设计技术先驱,计算机排版系统 TEX 和 METAFONT 的发明者 Donald Knuth,推荐使用以下形式:
126
139
127
140
``` Python
128
141
# Yes: easy to match operators with operands
@@ -134,15 +147,22 @@ income = (gross_wages
134
147
```
135
148
136
149
只要保持本地一致性,在二元运算符之前和之后断开都是允许的,但是新的 Python 代码推荐使用 Knuth 形式。
150
+
137
151
<h5 id =" 3.5 " >空行</h5 >
138
- 顶层函数和类定义使用两个空行。
139
- 类内方法定义使用一个空行。
140
- 不同函数组之间使用额外的空行隔离。
141
- 总之,空行的作用就是隔离不同函数类等,层次分明。
152
+ 顶层函数和类定义使用两个空行。
153
+
154
+ 类内方法定义使用一个空行。
155
+
156
+ 不同函数组之间使用额外的空行隔离。
157
+
158
+ 总之,空行的作用就是隔离不同函数类等,层次分明。
159
+
142
160
<h5 id =" 3.6 " >源文件编码</h5 >
143
- Python 2 默认ASCII,Python 3 默认UTF-8。
144
- 使用 ASCII 的 Python 2 源文件或使用 UTF-8 的 Python 3 源文件不应该有编码声明。
145
- 源文件最好只使用 ASCII 字符,即使是蹩脚的 Chinglish 亦可,家和万事兴。
161
+ Python 2 默认ASCII,Python 3 默认UTF-8。
162
+
163
+ 使用 ASCII 的 Python 2 源文件或使用 UTF-8 的 Python 3 源文件不应该有编码声明。
164
+
165
+ 源文件最好只使用 ASCII 字符,即使是蹩脚的 Chinglish 亦可,家和万事兴。
146
166
147
167
<h5 id =" 3.7 " >模块导入</h5 >
148
168
@@ -154,27 +174,30 @@ YES: from subprocess import Popen, PIPE
154
174
NO : import sys, os
155
175
```
156
176
157
- 模块导入总是位于文件顶部,在模块注释和文档字符串之后,模块全局变量和常量之前。
158
- 导入应该按照以下顺序分组,不同组间用空行隔离。
177
+ 模块导入总是位于文件顶部,在模块注释和文档字符串之后,模块全局变量和常量之前。
178
+
179
+ 导入应该按照以下顺序分组,不同组间用空行隔离。
180
+
159
181
* 标准库 imports
160
182
* 相关第三方 imports
161
183
* 本地特定应用/库 imports
162
- 推荐使用绝对导入,标准库代码应总是使用绝对导入。
184
+ 推荐使用绝对导入,标准库代码应总是使用绝对导入。
163
185
164
186
``` Python
165
187
import mypkg.sibling
166
188
from mypkg import sibling
167
189
from mypkg.sibling import example
168
190
```
169
191
170
- 在包结构比较复杂时,可以使用相对导入。
192
+ 在包结构比较复杂时,可以使用相对导入。
171
193
172
194
``` Python
173
195
from . import sibling
174
196
from .sibling import example
175
197
```
176
198
177
- 在 Python 3 中,相对导入已经被删除,禁止使用。
199
+ 在 Python 3 中,相对导入已经被删除,禁止使用。
200
+
178
201
类导入:
179
202
180
203
``` Python
@@ -189,15 +212,16 @@ import myclass
189
212
import foo.bar.yourclass
190
213
```
191
214
192
- 然后使用 myclass.MyClass 和 foo.bar.yourclass.YourClass。
215
+ 然后使用 myclass.MyClass 和 foo.bar.yourclass.YourClass。
216
+
193
217
请不要使用以下方式:
194
218
195
219
``` Python
196
220
from < module> import *
197
221
```
198
222
199
223
<h5 id =" 3.8 " >模块级别 dunder 名称</h5 >
200
- 模块级别 "dunders"(即具有两个前导和两个后缀下划线的名称),例如 \_\_ all \_\_ ,\_\_ author\_\_ ,\_\_ version\_\_ 等应放在模块 docstring 之后,但在任何 import 语句之前,但是除了 \_\_ future\_\_ 导入。 Python 强制 future-imports 必须在除了 docstrings 之外的任何其他代码之前出现在模块中。
224
+ 模块级别 "dunders"(即具有两个前导和两个后缀下划线的名称),例如 __ all __ ,\_\_ author\_\_ ,\_\_ version\_\_ 等应放在模块 docstring 之后,但在任何 import 语句之前,但是除了 \_\_ future\_\_ 导入。 Python 强制 future-imports 必须在除了 docstrings 之外的任何其他代码之前出现在模块中。
201
225
例如:
202
226
203
227
``` Python
@@ -216,6 +240,55 @@ import os
216
240
import sys
217
241
```
218
242
219
- <h5 id =" 4 " >字符串引号</h5 >
220
- 在 Python 中,单引号和双引号是等价的,只需要坚持使用一种并保持一致即可。
243
+ <h4 id =" 4 " >字符串引号</h4 >
244
+ 在 Python 中,单引号和双引号是等价的,只需要坚持使用一种并保持一致即可。
245
+
221
246
在双引号中使用单引号,单引号中使用双引号。三引号中使用双引号。
247
+
248
+ <h4 id =" 5 " >表达式和语句中的空格</h4 >
249
+ <h5 id =" 5.1 " >心理藏的小烦恼</h5 >
250
+ 在以下场景避免不必要的空格
251
+
252
+ ``` Python
253
+ Yes: spam(ham[1 ], {eggs: 2 })
254
+ No: spam( ham[ 1 ], { eggs: 2 } )
255
+
256
+ Yes: foo = (0 ,)
257
+ No: bar = (0 , )
258
+
259
+ Yes: if x == 4 : print x, y; x, y = y, x
260
+ No: if x == 4 : print x , y ; x , y = y , x
261
+
262
+ Yes:
263
+ ham[1 :9 ], ham[1 :9 :3 ], ham[:9 :3 ], ham[1 ::3 ], ham[1 :9 :]
264
+ ham[lower:upper], ham[lower:upper:], ham[lower::step]
265
+ ham[lower+ offset : upper+ offset]
266
+ ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
267
+ ham[lower + offset : upper + offset]
268
+
269
+ No:
270
+ ham[lower + offset:upper + offset]
271
+ ham[1 : 9 ], ham[1 :9 ], ham[1 :9 :3 ]
272
+ ham[lower : : upper]
273
+ ham[ : upper]
274
+
275
+ Yes: spam(1 )
276
+ No: spam (1 )
277
+
278
+ Yes: dct[' key' ] = lst[index]
279
+ No: dct [' key' ] = lst [index]
280
+
281
+ Yes:
282
+ x = 1
283
+ y = 2
284
+ long_variable = 3
285
+
286
+ No:
287
+ x = 1
288
+ y = 2
289
+ long_variable = 3
290
+
291
+ ```
292
+
293
+ <h5 id =" 5.2 " >其他建议</h5 >
294
+
0 commit comments