编码风格

错误认知

  • 这很浪费时间
  • 我是个艺术家
  • 所有人都能穿的鞋不会合任何人的脚
  • 我善长制定编码规范

正确认知

  • 促进团队合作
  • 减少bug处理
  • 提高可读性,降低维护成本
  • 有助于代码审查
  • 养成习惯,有助于程序员自身的成长

pep8 编码规范

Python Enhancement Proposals :python改进方案

https://www.python.org/dev/peps/

pep8 官网规范地址

https://www.python.org/dev/peps/pep-0008/

Guido的关键点之一是:代码更多是用来读而不是写。编码规范旨在改善Python代码的可读性。

风格指南强调一致性。项目、模块或函数保持一致都很重要。

每级缩进用4个空格。

括号中使用垂直隐式缩进或使用悬挂缩进。后者应该注意第一行要没有参数,后续行要有缩进。

  • Yes

    # 对准左括号
    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)
    • No
    层缩进.
    foo = long_function_name(
    var_one, var_two,
    var_three, var_four)
  • No
# 不使用垂直对齐时,第一行不能有参数。
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)

4个空格的规则是对续行可选的。

# 悬挂缩进不一定是4个空格
foo = long_function_name(
var_one, var_two,
var_three, var_four)
if语句跨行时,两个字符关键字(比如if)加上一个空格,再加上左括号构成了很好的缩进。后续行暂时没有规定,至少有如下三种格式,建议使用第3种。 # 没有额外缩进,不是很好看,个人不推荐.
if (this_is_one_thing and
that_is_another_thing):
do_something() # 添加注释
if (this_is_one_thing and
that_is_another_thing):
# Since both conditions are true, we can frobnicate.
do_something() # 额外添加缩进,推荐。
# Add some extra indentation on the conditional continuation line.
if (this_is_one_thing
and that_is_another_thing):
do_something()

右边括号也可以另起一行。有两种格式,建议第2种。

# 右括号不回退,个人不推荐
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,
]
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)

空格或Tab?

  • 空格是首选的缩进方法。
  • Tab仅仅在已经使用tab缩进的代码中为了保持一致性而使用。
  • Python 3中不允许混合使用Tab和空格缩进。
  • Python 2的包含空格与Tab和空格缩进的应该全部转为空格缩进。

最大行宽

  • 限制所有行的最大行宽为79字符。
  • 文本长块,比如文档字符串或注释,行长度应限制为72个字符。

空行

  • 两行空行分割顶层函数和类的定义。
  • 类的方法定义用单个空行分割。
  • 额外的空行可以必要的时候用于分割不同的函数组,但是要尽量节约使用。
  • 额外的空行可以必要的时候在函数中用于分割不同的逻辑块,但是要尽量节约使用。

源文件编码

  • 在核心Python发布的代码应该总是使用UTF-8(ASCII在Python 2)。
  • Python 3(默认UTF-8)不应有编码声明。

导入在单独行

  • Yes:
import os
import sys
from subprocess import Popen, PIPE
  • No:
import sys, os
  • 导入始终在文件的顶部,在模块注释和文档字符串之后,在模块全局变量和常量之前。

  • 导入顺序如下:标准库进口,相关的第三方库,本地库。各组的导入之间要有空行。

禁止使用通配符导入。

通配符导入(from import *)应该避免,因为它不清楚命名空间有哪些名称存,混淆读者和许多自动化的工具。

字符串引用

  • Python中单引号字符串和双引号字符串都是相同的。注意尽量避免在字符串中的反斜杠以提高可读性。
  • 根据PEP 257, 三个引号都使用双引号。

括号里边避免空格

# 括号里边避免空格
# Yes
spam(ham[1], {eggs: 2})
# No
spam( ham[ 1 ], { eggs: 2 } )

逗号,冒号,分号之前避免空格

# 逗号,冒号,分号之前避免空格
# Yes
if x == 4: print x, y; x, y = y, x
# No
if x == 4 : print x , y ; x , y = y , x

索引操作中的冒号当作操作符处理前后要有同样的空格(一个空格或者没有空格,个人建议是没有。)

# Yes
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]
# No
ham[lower + offset:upper + offset]
ham[1: 9], ham[1 :9], ham[1:9 :3]
ham[lower : : upper]
ham[ : upper]

函数调用的左括号之前不能有空格

# Yes
spam(1)
dct['key'] = lst[index] # No
spam (1)
dct ['key'] = lst [index]

赋值等操作符前后不能因为对齐而添加多个空格

# Yes
x = 1
y = 2
long_variable = 3 # No
x = 1
y = 2
long_variable = 3

二元运算符两边放置一个空格

涉及 =、符合操作符 ( += , -=等)、比较( == , < , > , != , <> , <= , >= , in , not in , is , is not )、布尔( and , or , not )。

优先级高的运算符或操作符的前后不建议有空格。

# Yes
i = i + 1
submitted += 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b) # No
i=i+1
submitted +=1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)

关键字参数和默认值参数的前后不要加空格

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

通常不推荐复合语句(Compound statements: 多条语句写在同一行)。

# Yes
if foo == 'blah':
do_blah_thing()
do_one()
do_two()
do_three() # No
if foo == 'blah': do_blah_thing()
do_one(); do_two(); do_three()

尽管有时可以在if/for/while 的同一行跟一小段代码,但绝不要跟多个子句,并尽量避免换行。

# No
if foo == 'blah': do_blah_thing()
for x in lst: total += x
while t < 10: t = delay()
更不是: # No
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()

避免采用的名字

决不要用字符'l'(小写字母el),'O'(大写字母oh),或 'I'(大写字母eye) 作为单个字符的变量名。一些字体中,这些字符不能与数字1和0区别。用'L' 代替'l'时。

包和模块名

模块名要简短,全部用小写字母,可使用下划线以提高可读性。包名和模块名类似,但不推荐使用下划线。

编码风格和PEP8规范的更多相关文章

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

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

  2. Android journey 1@关于编码风格和命名规范

    /* * 1.关于编程风格:每一位程序猿可能都有自己独特的编程风格,但是有些规则是大家都必须遵守的,特别 * 是在工作的过程中,良好的代码风格能大大提高代码本身的可阅读性和维护性,也更有利于别人修改你 ...

  3. 一步一步学Python(1) 基本逻辑控制举例和编码风格规范

    (1) 基本逻辑控制举例和编码风格规范 1.while死循环 2.for循环 3.if,elif,else分支判断 4.编码风格(官方建议) 版本:Python3.4 1.while死循环 #func ...

  4. Python PEP-8编码风格指南中文版

    #PEP 8 – Python编码风格指南 PEP: 8 Title: Style Guide for Python Code Author: Guido van Rossum , Barry War ...

  5. 「PSR 规范」PSR-2 编码风格规范

    所有 PSR 规范请见:https://learnku.com/docs/psr  https://learnku.com/laravel/t/2079/psr-specification-psr-2 ...

  6. 【PHP开发规范】继承与扩展:PSR-2 编码风格规范

    之前的一篇文章是对PSR-1的基本介绍 接下来是PSR-2 编码风格规范,它是 PSR-1 基本代码规范的继承与扩展. PSR-1 和PSR-2是PHP开发中基本的编码规范,大家其实都可以参考学习下, ...

  7. Android 编码风格规范,很赞哦

    1. 前言 这份文档参考了 Google Java 编程风格规范和 Google 官方 Android 编码风格规范.该文档仅供参考,只要形成一个统一的风格,见量知其意就可. 1.1 术语说明 在本文 ...

  8. PSR-2 编码风格规范

    本篇规范是 PSR-1 基本代码规范的继承与扩展. 本规范希望通过制定一系列规范化PHP代码的规则,以减少在浏览不同作者的代码时,因代码风格的不同而造成不便. 当多名程序员在多个项目中合作时,就需要一 ...

  9. PHP编码风格规范

    由于PHP的灵活性,很多人写起代码来也不讲求一个好的代码规范,使得本就灵活的PHP代码看起来很乱,其实PSR规范中的PSR-1和PSR-2已经定义了在PHP编码中的一些规范,只要我们好好遵守这些规范, ...

随机推荐

  1. java反射机制的作用与优点

    java的反射机制就是增加程序的灵活性,避免将程序写死到代码里,例如: 实例化一个 person()对象, 不使用反射, new person(); 如果想变成 实例化 其他类, 那么必须修改源代码, ...

  2. 一篇文章入门Jmeter性能测试【经典长文】

    孟船长  目录 1.性能测试定义2.为什么要做性能测试3.性能测试指标.性能测试分类4.Jmeter性能测试实战[入门级]5.参考文章链接 1.性能测试定义 百度&知乎 性能测试是通过自动化的 ...

  3. 【转】python基础-编码与解码

    [转自:https://www.cnblogs.com/OldJack/p/6658779.html] 一.什么是编码 编码是指信息从一种形式或格式转换为另一种形式或格式的过程. 在计算机中,编码,简 ...

  4. log parser 微软iis 日志分析

    Log Parser 2.2 您可以从 Microsoft 下载中心下载 Log Parser. Log Parser 2.2 是一个功能强大的通用工具,它可对基于文本的数据(如日志文件.XML 文件 ...

  5. jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容

    jquery.ellipsis 自动计算内容宽度(不是字数)截断,并加上省略号,内容不受中英文或符号限制. 如果根据字数来计算的话,因为不同字符的宽度并不相同,比如l和W,特别是中英文,最终内容宽度会 ...

  6. CAM 查看里先选哪些层才能方便查看

    CAM 检查 Gerber 时选 Layer 时有先后次序,才以看清楚是否有冲突. 比如检查 TOP 层时顺序应该是 MT ST L1 BOT 层检查顺序 MB SB L2/L4

  7. ActiveMQ集群方案

    集群方案主要为了解决系统架构中的两个关键问题:高可用和高性能.ActiveMQ服务的高可用性是指,在ActiveMQ服务性能不变.数据不丢失的前提下,确保当系统灾难出现时ActiveMQ能够持续提供消 ...

  8. saltops 安装及相关环境安装

    本次布署测试环境 阿里云 Centos 7.3 1.安装nginx,这里采用yum 安装方式 A.yum install nginx B.创建开机启动 systemctl enable nginx.s ...

  9. import()、import语句、require() 区别

    import命令能够接受什么参数,import()函数就能接受什么参数,两者区别主要是后者为动态加载. import() 与 import语句 区别 区别项 import() import语句 参数都 ...

  10. js 坐标兼容性

    不同浏览器对坐标属性的支持: