Python命名规则

发布时间 2023-10-09 10:32:08作者: 公子Learningcarer


标识符,必须以字母、下画线(_)开头(数字不能打头),后面可以跟任意数目的字母、数字和下画线(_)。
字母并不局限于 26 个英文字母,可以包含中文字符、日文字符等。
Python 语言是区分大小写的,因此 abc 和 Abc 是两个不同的标识符。
标识符不能是 Python 关键字,但可以包含关键字。
标识符不能包含空格。
Python 3 支持 UTF-8 字符集,因此 Python 3 的标识符可以使用 UTF-8 所能表示的多种语言的字符
Python 2.x 对中文支持较差,如果要在 Python 2.x 程序中使用中文字符或中文变量,则需要在 Python 源程序的第一行增加“#coding:utf-8”,当然别忘了将源文件保存为 UTF-8 字符集

标识符例子:

abc_xyz:合法。
HelloWorld:合法。
abc:合法。
xyz#abc:不合法,标识符中不允许出现“#”号。
abc1:合法。
1abc:不合法,标识符不允许数字开头。

1、包命名 mypackage,package_name
小写字母;
可使用下划线,单词之间用_分割;
如:mypackage,my_package

2、模块命名 mymodule.py,module_name.py
小写字母;
可使用下划线,单词之间用_分割;
如:mymodule.py,ad_stats.py

3、类命名 MyClass,ClassName
单词首字母大写;
如:AdStats,ConfigUtil,MyClass
内部类:可以使用额外的前导下划线;
如:__MyClass
基类:使用Base或Abstract前缀,如:CamelBase

4、函数命名
1)普通函数 myfunction(),my_function_name()
小写字母;
可使用下划线,单词之间用_分割;
如:myfunction(),my_example_function(),get_name() ,count_number() ,ad_stat()

2)私有函数(外部访问会报错) __get_name()
以__开头(2个下划线)
小写字母;
可使用下划线,单词之间用_分割;
如:__get_name()

3)函数和方法的参数 parameter,function_parameter_name
使用 self 作为实例方法的第一个参数;
使用 cls 作为类方法的第一个参数;
如果函数的参数名称,和保留的关键字冲突,通常使用一个后缀下划线好于使用缩写或奇怪的拼写;
缺省值等号两边无空格;def func(self, user=None):

5、变量命名
变量定义
全局变量:属于模块的属性,在模块内、所有函数外、在class外,这是全局变量;
局部变量:在函数内、在class的方法(构造、类方法、静态方法、实例方法)内(变量未加self修饰),这是局部变量
类变量:属于类的属性,在class内,且不在class的方法内,这是类变量
实例变量:属于对象的属性,在class的方法内,且使用self修饰的变量,这是实例变量
注意说明:

如果局部变量与全局变量同名,那么方法或者函数中将优先使用的是局部变量的值,而不是使用全局变量;
global关键字,显式的引用全局变量;

1)类变量(全局变量名) COLOR_WRITE,GLOBAL_VAR_NAME
大写字母;
单词之间用_分割;
在java中相当于static静态变量;
如:NUMBER,COLOR_WRITE

2)常量 MAX_OVERFLOW,TOTAL
大写字母;
单词之间用_分割;
如:MAX_OVERFLOW,TOTAL

3)普通变量 this_is_a_var ,local_var_name
小写字母;
可使用下划线,单词之间用_分割;
如:this_is_a_var

4)实例变量 _instance_var
以_开头(1个下划线)
小写字母;
可使用下划线,单词之间用_分割;
如:_price ,_instance_var

5)私有实例变量(外部访问会报错) __private_var
以__开头(2个下划线)
小写字母;
可使用下划线,单词之间用_分割;
如:__price ,__private_var

6)专有变量 __class__
__开头,__结尾;
一般为python的自有变量,开发不要以这种方式命名;
如:__doc__ ,__class__

6、异常命名 ExceptionNameError
以 Error 作为后缀;

7、缩写
命名应当尽量使用全拼写的单词;
常用的缩写,如XML、ID等,在命名时也应只大写首字母,如XmlParser
命名中含有长单词,对某个单词进行缩写,应使用约定成俗的缩写方式;
如:
function 缩写为 fn
text 缩写为 txt
object 缩写为 obj
count 缩写为 cnt
number 缩写为 num

8、前导后缀下划线
Python 用下划线,作为变量前缀和后缀,指定特殊变量;
一个前导下划线:表示非公有,是私有的,如:_myprice ,_foo
在模块或类外不可以使用,只有类对象和子类对象自己能访问到这些变量;
不能直接访问的类属性,需通过类提供的接口进行访问;
_xxx 不能用'from module import *'导入
一个后缀下划线:避免关键字冲突,如:count_
两个前导下划线:当命名一个类属性引起名称冲突时使用,也可能是私有成员,如:__name, __foo
只有类对象自己能访问,连子类对象也不能访问到这个数据;
类中的私有变量名

两个前导和后缀下划线:“魔”(有特殊用途)对象或者属性,如:__init__()代表类的构造函数,或者__file__
一般是系统定义名字,系统保留字命名法;
绝对不要创造这样的名字,而只是使用它们;
项目中可以使用这种命名,它的意义在于这种形式的变量是只读的,这种形式的类成员函数尽量不要重载;如:
其中 __id__、__parent__ 和 __message__ 都采用了系统保留字命名法;
class Base(object):
def __init__(self, id, parent = None):
self.__id__ = id
self.__parent__ = parent
def __message__(self, msgid):

注意说明:

下划线,对解释器有特殊的意义,是内建标识符所使用的符号,建议程序员避免用下划线作为变量名的开始;

9、Python关键字
如果开发者尝试使用关键字作为变量名,Python 解释器会报错。
查看关键字:

#导入keyword 模块
import keyword
#显示所有关键字
keyword.kwlist
输出结果:

['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']

10、Python内置函数
如果开发者使用内置函数的名字作为变量名,Python 解释器倒不会报错,只是该内置函数就被这个变量覆盖了,该内置函数就不能使用了。
Python内置函数
abs() all() any() basestring() bin()
bool() bytearray() callable() chr() classmethod()
cmp() compile() complex() delattr() dict()
dir() divmod() enumerate() eval() execfile()
file() filter() float() format() frozenset()
getattr() globals() hasattr() hash() help()
hex() id() input() int() isinstance()
issubclass() iter() len() list() locals()
long() map() max() memoryview() min()
next() object() oct() open() ord()
pow() print() property() range() raw_input()
reduce() reload() repr() reversed() zip()
round() set() setattr() slice() sorted()
staticmethod() str() sum() super() tuple()
type() unichr() unicode() vars() xrange()
Zip() __import__() apply() buffer() coerce()
intern

Python代码规范
1、代码行长度
每行代码尽量不超过 80 个字符,在特殊情况下可以略微超过 80 ,但最长不得超过 120;

2、引号的使用
自然语言 使用双引号 “…” ,如:错误信息;很多情况还是 unicode,使用u"你好世界"
机器标识 使用单引号 ‘…’ ,如:dict 里的 key
正则表达式使用原生的双引号 r"…"
文档字符串 (docstring) 使用三个双引号"""文档字符串"""

3、空行的使用
1)模块中,函数,类定义之间,空2行
def fun1():
pass


def fun2():
pass


class MyClass:
pass

2)类成员函数之间,空1行
def __init__(self):
pass

def hello(self):
pass

3)在二元运算符两边,各空一格 [=,-,+=,==,>,in,is not, and]
正确的写法

i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
不推荐的写法

i=i+1
submitted +=1
x = x2 - 1
hypot2 = xx + y*y
c = (a+b) * (a-b)

4)函数的参数列表中,逗号之后,要有空格
正确的写法

def complex(real, imag):
pass
不推荐的写法

def complex(real,imag):
pass

5)函数的参数列表中,默认值等号两边,不要添加空格
正确的写法

def complex(real, imag=0.0):
pass
不推荐的写法

def complex(real, imag = 0.0):
pass

6)左括号之后,右括号之前,不要加多余的空格
正确的写法

spam(ham[1], {eggs: 2})
不推荐的写法

spam( ham[1], { eggs : 2 } )

7)字典对象的左括号之前,不要多余的空格
正确的写法

dict['key'] = list[index]
不推荐的写法

dict ['key'] = list [index]

8)不要为对齐赋值语句,而使用额外空格
正确的写法

x = 1
xy = 2
不推荐的写法

x = 1
xy = 2

4、import 语句
1)单独import时,不要在一行导入多个;
正确的写法

import os
import sys
不推荐的写法

import sys,os

2)from ... import可以在一行导入多个
正确的写法

from subprocess import Popen, PIPE

3)import语句应该使用 absolute import
正确的写法

from foo.bar import Bar
不推荐的写法

from …bar import Bar

4)import语句书写位置
import语句应该放在文件头部,置于模块说明及docstring之后,于全局变量之前;

 

import语句应该按照顺序排列,每组之间用一个空行分隔;

import os
import sys

import msgpack
import zmq

import foo

导入其他模块的类定义时,可以使用相对导入;

from myclass import MyClass

5)如果发生命名冲突,则可使用命名空间
import bar
import foo.bar

bar.Bar()
foo.bar.Bar()

5、换行
1)禁止复合语句,即一行中包含多个语句
正确的写法

do_first()
do_second()
do_third()
不推荐的写法

do_first();do_second();do_third();

2)if/for/while一定要换行
正确的写法

if foo == 'blah':
do_blah_thing()
不推荐的写法

if foo == 'blah': do_blash_thing()

3)支持括号内的换行
括号内的换行,第二行缩进到括号的起始处;
起始括号就换行,第二行缩进 4 个空格
foo = fun(
var_one, var_two, # 起始括号就换行,第二行缩进 4 个空格
var_three, var_four) # 第二行缩进到括号的起始处

4)使用反斜杠\换行,二元运算符+ .等应出现在行末

6、注释
1)块注释
“#”号后空一格;
段落间用空行分开(同样需要“#”号)
# 块注释
mystr = 'hello'

2)行注释
至少使用两个空格和语句分开
mystr = 'hello' # 行注释

3)文档注释(Docstring)
所有的公共模块、函数、类、方法,都应该写文档注释 docstring
私有方法不一定需要,但应该在 def 后提供一个块注释来说明。

docstring 的首行不换行, 如有多行,结束"""应该独占一行,除非此 docstring 只有一行。

"""Return a foobar
公共模块文档注释
"""

"""类、方法、函数文档注释"""

文档注释,一般是放在自定义的模块/类/方法/函数的第一行,添加功能说明,可以使用.__doc__获取对应说明;

def myfunction():
"""我的文档注释说明"""
print("文档注释")


print(myfunction.__doc__)
输出结果:我的文档注释说明

 

不要在文档注释复制函数定义原型, 而是具体描述其具体内容, 解释具体参数和返回值等

# 不推荐的写法(不要写函数原型等废话)
def function(a, b):
"""function(a, b) -> list"""
... ...


# 正确的写法
def function(a, b):
"""计算并返回a到b范围内数据的平均值"""
... ...

对函数参数、返回值等的说明采用numpy标准, 如下所示

def func(arg1, arg2):
"""在这里写函数的一句话总结(如: 计算平均值).
这里是具体描述.
参数
----------
arg1 : int
arg1的具体描述
arg2 : int
arg2的具体描述
返回值
-------
int
返回值的具体描述
参看
--------
otherfunc : 其它关联函数等...
示例
--------
示例使用doctest格式, 在`>>>`后的代码可以被文档测试工具作为测试用例自动运行
>>> a=[1,2,3]
>>> print [x + 3 for x in a]
[4, 5, 6]
"""

 

文档注释不要中英文混用,通常一两句话能把情况说清楚即可

模块、公有类、公有方法, 能写文档注释的, 应该尽量写文档注释

 

4)重要的注释
比较重要的注释段, 使用多个等号=隔开, 可以更加醒目, 突出重要性
# =====================================
# 请勿在此处添加 get post等app路由行为 !!!
# =====================================

7、模块
将相关的类和顶级函数,放在同一个模块里,不像Java, 没必要限制一个类一个模块;