1、代码布局
1、缩进
每个缩进级别使用4个空格。
续行应该与其包裹元素对齐,要么使用圆括号、方括号和花括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐 。
# Correct: # 添加4个空格(额外的缩进级别)以将参数与其他参数区分开来。 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) # 悬挂式缩进应增加一个级别 foo = long_function_name( var_one, var_two, var_three, var_four)
# Wrong: # Arguments on first line forbidden when not using vertical alignment. foo = long_function_name(var_one, var_two, var_three, var_four) # Further indentation required as indentation is not distinguishable. def long_function_name( var_one, var_two, var_three, var_four): print(var_one)
多行构造上的右大括号/括号/圆括号可以排在列表最后一行的第一个非空白字符下,如:
my_list = [ 1, 2, 3, 4, 5, 6, ] result = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', )
或者它可以排列在开始多行构造的行的第一个字符下,如:
my_list1 = [ 1, 2, 3, 4, 5, 6, ] result2 = some_function_that_takes_arguments( 'a', 'b', 'c', 'd', 'e', 'f', )
2、制表符或空格
1、空格是首选的缩进方法
2、制表符应仅用于与已经缩进制表符的代码保持一致。
3、python中不允许空格和制表符混用
3、最大长度
1、所有行限制在最多79个字符。
2、对于具有较少结构性限制的流动的长块文本(文件或注释),行长度应限制在72个字符。
3、反斜杠可以保持语句的连续性
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())
4、二进制运算符之前还是之后换行
# Wrong: income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest) # Correct: income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest)
5、源文件编码
代码中的核心组,应该始终使用UTF-8,并且不应该有编码声明。
6、模块导入
1、导入模块应该但单独进行
# Correct: import os import sys # Wrong: import sys, os
2、导入同一模块的不同类、函数、常量等
# Correct: from subprocess import Popen, PIPE
3、导入模块的顺序
1、标准库的导入
2、第三方接口的导入
3、本地程序的导入
4、绝对路径导入
import mypkg.sibling from mypkg import sibling from mypkg.sibling import example
7、模块级别dunders
有两个前缀和两个后缀的名称
__all__
,__author__
,__version__
等应放在模块文档字符串之后"""This is the example module. This module does stuff. """ from __future__ import barry_as_FLUFL __all__ = ['a', 'b', 'c'] __version__ = '0.1' __author__ = 'Cardinal Biggles' import os import sys
8、空行
1、顶层函数和类的定义,前后用两个空行隔开。
2、类里的方法定义用一个空行隔开。
class ModelOne(object): def __init__(self): pass def __new__(cls, *args, **kwargs): pass def model_two(): pass
2、字符串引号
在Python中,单引号字符串和双引号字符串是相同的。但是,当一个字符串包含单引号或双引号字符时,请使用另一条规则来避免字符串中出现反斜杠。它提高了可读性。
3、表达式和语句中的空格
1、紧贴在括号、中括号或花括号内侧
# Correct: spam(ham[1], {eggs: 2}) # Wrong: spam( ham[ 1 ], { eggs: 2 } )
2、后面的逗号紧贴括号的内测
# Correct: foo = (0,) # Wrong: bar = (0, )
3、逗号、分号或冒号靠前
# Correct: if x == 4: print(x, y); x, y = y, x # Wrong: if x == 4 : print(x , y) ; x , y = y , x
4、切片
# Correct: ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:] ham[lower:upper], ham[lower:upper:], ham[lower::step] ham[lower+offset : upper+offset] ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)] ham[lower + offset : upper + offset] # Wrong: ham[lower + offset:upper + offset] ham[1: 9], ham[1 :9], ham[1:9 :3] ham[lower : : step] ham[ : upper]
5、函数的调用
# Correct: spam(1) # Wrong: spam (1)
6、方括号的索引切片
# Correct: dct['key'] = lst[index] # Wrong: dct ['key'] = lst [index]
7、变量赋值
# Correct: x = 1 y = 2 long_variable = 3 # Wrong: x = 1 y = 2 long_variable = 3
8、如果使用了不同优先级的操作符,可以考虑在优先级最低的操作符(ES)周围添加空格
# Correct: i = i + 1 submitted += 1 x = x*2 - 1 hypot2 = x*x + y*y c = (a+b) * (a-b) # Wrong: i=i+1 submitted +=1 x = x * 2 - 1 hypot2 = x * x + y * y c = (a + b) * (a - b)
9、函数注释应该使用普通的计算机规则,并且总是在计算机周围有空格。
->
如果有箭头# Correct: def munge(input: AnyStr): ... def munge() -> PosInt: ... # Wrong: def munge(input:AnyStr): ... def munge()->PosInt: ...
10、关键字默认参数
# Correct: def complex(real, imag=0.0): return magic(r=real, i=imag) # Wrong: def complex(real, imag = 0.0): return magic(r = real, i = imag) # Correct: def munge(sep: AnyStr = None): ... def munge(input: AnyStr, sep: AnyStr = None, limit=1000): ... # Wrong: def munge(input: AnyStr=None): ... def munge(input: AnyStr, limit = 1000): ...
11、复合语句(同一行上的多个语句)不鼓励:
# Correct: if foo == 'blah': do_blah_thing() do_one() do_two() do_three() 相反,不: # Wrong: if foo == 'blah': do_blah_thing() do_one(); do_two(); do_three()
12、代码块不鼓励写在同一行
# Wrong: if foo == 'blah': do_blah_thing() for x in lst: total += x while t < 10: t = delay() 当然不会: # Wrong: if foo == 'blah': do_blah_thing() else: do_non_blah_thing() try: something() finally: cleanup() do_one(); do_two(); do_three(long, argument, list, like, this) if foo == 'blah': one(); two(); three()
4、何时使用后缀逗号
# Correct: FILES = ('setup.cfg',) # Wrong: FILES = 'setup.cfg',
# Correct: FILES = [ 'setup.cfg', 'tox.ini', ] initialize(FILES, error=True, ) # Wrong: FILES = ['setup.cfg', 'tox.ini',] initialize(FILES, error=True,)
5、注释
1、块注释
与代码相矛盾的注释比没有注释更糟糕。当代码发生变化时,始终优先考虑保持注释的最新状态!
评论应该是完整的句子。第一个单词应该大写,除非它是以小写字母开头的标识符(永远不要改变标识符的大小写!)。
块注释通常由一个或多个由完整句子组成的段落组成,每个句子都以句点结尾。
在多句评论中,除了在最后一句之后,你应该在句尾句号后使用一到两个空格。
确保你的评论清晰易懂,便于其他使用你所写语言的人理解。
来自非英语国家的Python程序员:请用英语写下你的评论,除非你有120%的把握,这些代码永远不会被不会说你的语言的人阅读。
2、内联注释
少使用内联注释。
内联注释是与语句在同一行上的注释。内联注释应该与语句至少分隔两个空格。它们应该从#和一个空格开始。
x = x + 1 # Compensate for border
3、文件字符串(多行注释)
为所有公共模块、函数、类和方法编写文档字符串.
"""Return a foobang Optional plotz says to frobnicate the bizbaz first. """ """Return an ex-parrot."""
6、命名规范
1、模块
模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)
# 正确的模块名
import decoder
import html_parser
# 不推荐的模块名
import Decoder
2、类名
类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
class Farm():
pass
class AnimalFarm(Farm):
pass
class _PrivateFarm(Farm):
pass
将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.
3、函数
函数名一律小写,如有多个单词,用下划线隔开
def run():
pass
def run_with_env():
pass
私有函数在函数前加一个下划线_
class Person():
def _private_func():
pass
4、变量名
变量名尽量小写, 如有多个单词,用下划线隔开
if __name__ == '__main__':
count = 0
school_name = ''
常量采用全大写,如有多个单词,使用下划线隔开
MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600
5、常量
常量使用以下划线分隔的大写命名
MAX_OVERFLOW = 100
Class FooBar:
def foo_bar(self, print_):
print(print_)