最近一直在强调代码规范,但是有很多朋友不太清楚,我到底要怎么抒写代码,才算是规范呢?
所以,老Amy就在考虑,好记性不如烂笔头,反复强调不如一篇文章反复查阅。hhhh~
那什么是代码规范呢?代码规范也就是指在编写代码时,我们需要去遵循一些通用的编写方式或编写风格。注意,并不做强制性(也就是说不按规范写并不会报错),但是却是《程序员自我修养》的必学之技。开始肝!
那今天主要来聊聊 Python 编码风格指南——PEP 8
PEP 8 的英文全称为 Style Guide for Python Code ,即 Python 编码风格规范,主要涵盖三个大的方面
命名规范是我们一直在强调的,那实际上它是一个非常具有扩展性的话题,我们需要了解 主要的命令规则 以及 python 中针对 不同元素 的常用命名方式。
oldKing
OldKing
_
连接,比如 old_king
除此之外,还有其他形式的命名规则,比如大写 OLDKING
、大写结合下划线OLD_KING
、小写 oldking
等。另外在 Python 中也有 前缀 或者 后缀 下划线、双下划线等命名方式。
对于变量与常量:
const
的概念,常量 仅仅是一种 约定(常量通常放置在代码顶部、或单独的模块、或特定的配置文件中)。key_value
的形式,其中 key、value
为键和值的实际含义。比如:information_value = {"name":"amy","age":18}
has、is
作为前缀。对于类(和异常):
int、list
),类和属性常采用名词,方法多采用动词或者包含动词。Base
作为前缀,抽象类 常采用 Abstract
作为前缀。Error
后缀(并不是所有异常都代表代码运行错误,比如 KeyboardInterrupt、SystemExit )。对于函数、方法:
self
,类方法的首个参数应为 cls
( class
作为关键字不能被使用,常被cls
或 klass
替换);对于模块和包:
__init__
模块以外)特殊格式:
_name
,常称为 ”伪私有属性“(也可用于私有的方法、类等),这种命名方式在 Python 中是一种表示私有属性的约定(同时注意 from ... import *
时不会导入这种形式的对象,并且这种伪私有变量通常会通过特定的方法来获取或者赋值),私有属性通常没有直接对外的功能,常用于记录内部状态或用于提供一些公共功能的方法内使用;name_
,常用于 避免 和 Python 的 关键字 发生冲突;__name
,常用于 基类避免 和 子类中的命名冲突,Python 会通过转换规则将其转换为类似_Class__name
的形式,这种方式通常称为命名修饰 name mangling
或 name decoration
(这种方式通常用于多继承,应避免将这种形式用在私有属性的命名上);>>> class MyClass:
... __name = 1
...
>>> MyClass.__name # 无法直接访问
Traceback (most recent call last):
File "", line 1, in
AttributeError: type object 'MyClass' has no attribute '__name'
>>> MyClass._MyClass__name
1
__name__
,这是我们之前提到过的 Python 内部常用的 dunder 名称,不应自定义这类命名。注释对于代码的阅读、扩展以及维护都非常重要。在 Python 中常用的注释方式有三种,分别为块注释( Block Comments )、行内注释( Inline Comments )、文档字符串( Documentation Strings )。
块注释( Block Comments )
#
的空行隔开,每个段落由完整的句子构成,在每行以 #
和一个空格开始。另外,块注释和被注释代码之间应具有同级别的缩进,这样有助于区分注释和代码之间关联关系。如下代码体现出块注释:@classmethod
def fromkeys(cls, iterable, v=None):
# There is no equivalent method for counters because the semantics
# would be ambiguous in cases such as Counter.fromkeys('aaabbc', v=2).
# Initializing counters to zero values isn't necessary because zero
# is already the default value for counter lookups. Initializing
# to one is easily accomplished with Counter(set(iterable)). For
# more exotic cases, create a dictionary first using a dictionary
# comprehension or dict.fromkeys().
raise NotImplementedError(
'Counter.fromkeys() is undefined. Use Counter(iterable) instead.')
行内注释( Inline Comments )
#
和一个空格开始。one_list = [] # 创建列表
文档字符串( Documentation Strings )
在 Python 中,最重要的注释形式便是 文档字符串。主要用于两方面:
当然大家现在可能很难体会到文档字符串的重要性,但是提到开源这个词,我们就会知道,一个开源文档的质量取决于它的可读性,而可读性往往伴随着大量的说明文档。
def function_name():
"""docstrings"""
pass
Python 在语法上使用 缩进 来确定代码块的开始和结束,对于每一级缩进,都应该是 4个空格。当然,在 Pycharm 当中,我们可以设置使用 tab 键来进行缩进。
那需要注意,缩进本身是 强制性的,但是空格数量实际上语法并没有做限制。只不过同级代码缩进空格一致即可。
当然,一般我们都是以 4个空格 来进行使用。
# 4个空格表示缩进
def function_name():
"""docstrings"""
pass
# 8个空格表示缩进
def function_name_two():
"""docstrings"""
pass
函数与类之间应该使用两个空行隔开,而类的内部的方法之间应该使用一个空行隔开,函数或方法中不同功能的代码块可使用空行隔开。
观察以下代码空行规则:
class MyClass(object):
def method_one(self):
pass
def method_two(self):
pass
def function_name():
"""docstrings"""
pass
def function_name_two():
"""docstrings"""
pass
奥啦~常用的我们就讲解到此,大家在写代码的时候一定要注意代码规范奥!这样才会增加我们代码的可读性,显得更加专业。如果认真的看到这里,给自己一个666叭
想学习更多关于python的文章,欢迎专注我们的公众号奥~