python 编码规范-命名规范

2023-11-10

常见的命名规则

  • 匈牙利命名法
    • 以一至多个小写字母表示其属性、类型,后接首字母大写的一至多个单词表示其作用描述。
    • 比如 m_bCanRun,其中 m_ 表示其为成员变量,b 表示其类型为布尔值,CanRun 表示其代表是否可以检查的含义。
  • 驼峰命名法
    • 以一至多个逻辑单元构成,每个逻辑单元可称为一个识别字,
    • 首个识别字首字母小写,其余识别字首字母大写,比如 canRun
    • 由于首字母小写,这种形式也被称为小驼峰命名法。
  • 帕斯卡命名法:和驼峰命名法类似,区别为首字母大写,如 CanRun,也被称为大驼峰命名法。
  • 下划线命名法:和驼峰命名法类似,区别为所有识别字均小写,识别字之间使用 _ 连接,比如 can_run

Python 常用的命名方式

通用准则

  • 无论你编写的模块、类、还是函数,其中对外暴露出的公共使用部分的命名应从使用场景出发。比如 os 模块中 makedirsremovedirs 等函数的命名,我们可以清楚的知道这些函数的使用场景,而不用关心其内部实现;
  • 尽量使用完整的、准确的、易于理解的、具有明确目的的单词来命名,或者使用下划线将可以表达完整含义的单词(或缩写,但缩写往往会造成不明确)进行连接(哪怕这样会很长,Explicit is better than implicit );
  • 避免使用容易混淆的字符,比如 l( L 的小写)、O( o 的大写)等;
  • 避免采用内置名称、关键字和已经使用过的名称,避免采用过于通用的名称,前者会造成原有功能的屏蔽,后者会造成含义过于广泛而失去明确性;
  • 与此同时,还有观点表示应避免使用 toolsutilscommon 等名称,以及避免使用以 object 、manager / management 、handler 等作为后缀的名称,这些观点中将其称之为反模式,认为这些名称没有起到实际的意义,并且类似 utils 的命名反而最终会成为劣质代码的聚集地,并且将这种名称认为是缺乏设计的名称,我们在这里将这些观点当作一种扩展阅读即可;

对于变量(和常量)

  • 变量名可小写,也可使用下划线命名;
  • 类型变量名(常用于类型提示)应使用大驼峰命名;
  • 常量应使用全大写字母,必要时使用下划线分隔,并且要注意在 Python 中并没有类似其他语言中 const 的概念,常量仅仅是一种约定(常量通常放置在代码顶部、或单独的模块、或特定的配置文件中)。对于一组常量,不应使用同一个前缀(这也适用于在同一个类中的方法或者属性),因为这样会和模块名称造成冗余,若多组常量,则针对每一组常量可以使用同一前缀。
  • 对于容器类变量,常采用复数名词形式;对于映射类变量,常采用 key_value 的形式,其中 keyvalue 为键和值的实际含义。
  • 对于表示布尔值的变量或者常量(但不仅限于这两者),常采用 hasis 作为前缀。

对于类(和异常)

  • 类名应使用大驼峰命名(这里不包括一些 Python 内置的类,比如 intlist ),类和属性常采用名词,方法多采用动词或者包含动词。
  • 基类常采用 Base 作为前缀,抽象类常采用 Abstract 作为前缀。
  • 异常名应使用大驼峰命名法,当此异常表示一个错误时,应添加 Error 后缀(并不是所有异常都代表代码运行错误,比如 KeyboardInterruptSystemExit )。

对于函数、方法

  • 函数名、方法名应使用小写,也可使用下划线命名(但我们仍会在一些代码中看到一些方法或者函数名称采用了驼峰命名法,甚至在 Python 的标准库中也存在这样的现象,比如在 threading 模块中,因为这些代码的出现往往早于 PEP 8 规范的诞生,同时为了向后兼容而保留,但通常这些模块都会提供相同功能的以小写加下划线命名的方法,我们应该尽可能使用这些新的方法)。
  • 实例方法的首个参数名应为 self ,类方法的首个参数应为 cls( class 作为关键字不能被使用,常被 cls 或 klass 替换);

对于模块和包

  • 模块( modules )名应尽可能使用小写,在必要时可以使用下划线命名(除了 __init__ 模块以外),当使用 C/C++ 编写扩展模块时,通常需要添加下划线前缀;
  • 包( packages )名应使用小写,最好不要使用下划线;

特殊格式

  • 单下划线前缀,比如 _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):
  Python Shell, prompt 83, line 1
builtins.AttributeError: type object 'MyClass' has no attribute '__name'
  • 前后双下划线,比如 __name__ ,这是我们之前提到过的 Python 内部常用的 dunder 名称,不应自定义这类命名。

模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)

# 正确的模块名
import decoder
import html_parser

# 不推荐的模块名
import Decoder

类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头

class Farm():
    pass

class AnimalFarm(Farm):
    pass

class _PrivateFarm(Farm):
    pass

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

函数名一律小写,如有多个单词,用下划线隔开

def run():
    pass

def run_with_env():
    pass

私有函数在函数前加一个下划线_

class Person():

    def _private_func():
        pass

变量名尽量小写, 如有多个单词,用下划线隔开

if __name__ == '__main__':
    count = 0
    school_name = ''

常量采用全大写,如有多个单词,使用下划线隔开

MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600

常量使用以下划线分隔的大写命名

MAX_OVERFLOW = 100

Class FooBar:

    def foo_bar(self, print_):
        print(print_)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 编码规范-命名规范 的相关文章

  • 更改 Inkscape 的 Python 解释器

    在使用 Inkscape 时 我不断收到错误 这似乎意味着未满足 python 2 vs 3 的期望 尽管我已经安装了它们 例如 当我尝试从模板生成新文档时 我得到 Traceback most recent call last File
  • 使用 Flask SQLAlchemy 进行表(模型)继承

    我遵循了这个建议question https stackoverflow com questions 1337095 sqlalchemy inheritance但我仍然收到此错误 sqlalchemy exc NoForeignKeysE
  • Python中#和"""注释的区别

    开始用 Python 编程 我看到一些带有注释的脚本 and comments 这两种评论方式有什么区别 最好的事情就是阅读PEP 8 Python 代码风格指南 https www python org dev peps pep 0008
  • 使用 GeoDjango 在坐标系之间进行转换

    我正在尝试将坐标信息添加到我的数据库中 添加django contrib gis支持我的应用程序 我正在写一个south数据迁移 从数据库中获取地址 并向 Google 询问坐标 到目前为止 我认为我最好的选择是使用geopy为了这 接下来
  • 使用 python 通过搜索端点从 Spotify API 获取曲目

    因此 我尝试使用 API 的搜索端点进行搜索 从而从 Spotify API 获取曲目 请参阅文档 https developer spotify com documentation web api reference search sea
  • 同情因子简单关系

    我在 sympy 中有一个简单的因式分解问题 无法解决 我在 sympy 处理相当复杂的积分方面取得了巨大成功 但我对一些简单的事情感到困惑 如何得到 phi 2 2 phi phi 0 phi 0 2 8 因式分解 phi phi 0 2
  • 代理阻止网络套接字?如何绕行

    我有一个用 Python 编写的正在运行的 websocket 服务器 来自https github com opiate SimpleWebSocketServer https github com opiate SimpleWebSoc
  • 如何在Python中正确声明ctype结构+联合?

    我正在制作一个二进制数据解析器 虽然我可以依靠 C 但我想看看是否可以使用 Python 来完成该任务 我对如何实现这一点有一些了解 我当前的实现如下所示 from ctypes import class sHeader Structure
  • 如何创建指向指针数组的 Python ctypes 指针

    我需要学习如何处理char 在下面的 C 方法中通过 Python ctypes 我通过使用调用其他只需要单个指针的方法做得很好create string buffer 但此方法需要一个指向指针数组的指针 ladybugConvertToM
  • 散景中的时间序列流

    我想在散景中绘制实时时间序列 我只想在每次更新时绘制新的数据点 我怎样才能做到这一点 散景网站上有一个动画情节的示例 但它每次都需要重新绘制整个图片 另外 我正在寻找一个简单的示例 我可以在其中逐点绘制时间序列的实时绘图 散景效果0 11
  • 将 ASCII 字符转换为“”unicode 表示法的脚本

    我正在对 Linux 区域设置文件进行一些更改 usr share i18n locales like pt BR 并且需要格式化字符串 例如 d m Y H M 必须以 Unicode 指定 其中每个 在本例中为 ASCII 字符表示为
  • 如何在 Spyder IDE 中安装 Selenium 包

    我刚刚在工作中安装了 Spyder IDE 仅 Spyder 不是整个 Anaconda 并且希望使用 FireFox 自动化我的工作 我的问题是 如何安装 Selenium 软件包 I figured it out Here is ins
  • 如何在 Tkinter 的 Button 小部件中创建多个标签?

    我想知道如何在 Tkinter 中创建具有多个标签的按钮小部件 如下图所示 带有子标签的按钮 https i stack imgur com jOZRw jpg正如您所看到的 在某些按钮中有一个子标签 例如按钮 X 有另一个小标签 A 我试
  • 通过套接字发送字符串(python)

    我有两个脚本 Server py 和 Client py 我心中有两个目标 能够从客户端一次又一次地向服务器发送数据 能够将数据从服务器发送到客户端 这是我的 Server py import socket serversocket soc
  • 如何在包更新之间保留数据文件?

    我正在使用data files的论证setuptools setup 将配置文件安装到 etc和用户主目录 但是更新包pip install
  • 通过子类化 `io.TextIOWrapper` 来子类化文件 - 但它的构造函数有什么签名?

    我正在尝试子类化io TextIOWrapper下列的这个帖子 https stackoverflow com a 23796737 974555 虽然我的目标不同 以此开始 注意 动机 https stackoverflow com a
  • 对 pandas 数据框中的每一列应用函数

    我如何以更多的熊猫方式编写以下函数 def calculate df columns mean self df means for column in df columns columns tolist cleaned data self
  • 升级后 pip 损坏

    我做了 pip install U easyinstall 然后 pip install U pip 来升级我的 pip 但是 当我尝试使用 pip 时 我现在收到此错误 root d8fb98fc3a66 which pip usr lo
  • 如何获取所有Python标准库模块的列表?

    我想要类似的东西sys builtin module names标准库除外 其他不起作用的事情 sys modules 只显示已经加载的模块 sys prefix 包含非标准库模块并且似乎无法在 virtualenv 内工作的路径 我想要这
  • 使用Python的timeit获取“全局名称'foo'未定义”

    我想知道执行一条Python语句需要多少时间 所以我上网查了一下 发现标准库提供了一个名为timeit http docs python org library timeit html旨在做到这一点 import timeit def fo

随机推荐

  • 【每日一具3】推荐一个4K、蓝光、3D高清影视下载站,影视资源丰富 发烧友必备

    我猜测大家收藏都是有些能看片源比较丰富能看最新电影的网站 这些网站往往都是采集最大资源网的片源 最新的电影收录后的画质不敢恭维 对于那些真正的影视爱好者来说这不是最好的选择 今天博谈天下给你们推荐一个4K 蓝光 3D高清影视下载站 这个网站
  • C++多态

    C 中的多态分为静态多态和动态多态两种 其中 静态多态在编译阶段实现 其原理是由函数重载实现 通过不同的实参调用其相应的同名函数 动态多态通过虚函数实现 以下着重介绍 动态多态的两个必要条件 必须通过基类的指针或者引用调用 被调用的必须是虚
  • TamperMonkey油猴脚本弹出系统通知

    TamperMonkey油猴脚本弹出系统通知 通知问题 解决方法 删除通知 修改通知内容 通知问题 安装某些TamperMonkey油猴脚本后偶尔弹出如下系统通知 通知标题显示为Microsoft Edge或Chrome 正在使用的浏览器
  • laravel模型中数据批量加入

    laravel模型中数据批量加入 控制器 关联新增批量加入 user User find 19 user gt book gt saveMany new Book title gt 哈利波特1 new Book title gt 哈利波特2
  • Java课题笔记~ SpringMVC概述

    1 1 SpringMVC简介 SpringMVC 也叫Spring web mvc 是Spring 框架的一部分 在Spring3 0 后发布的 1 2 SpringMVC的优点 基于MVC 架构 基于 MVC 架构 功能分工明确 解耦合
  • 性能测试指标全解

    最近在公司做压测时 对于各个监控工具的监控指标一脸蒙 有时候不清晰 有时候理解错误 于是 恶补基础知识 希望对广大网友有所帮助 一 性能测试指标 1 在线用户数 此指标指的是某个时间段内 在服务器上保持登录状态的用户数 在线用户数不等同于并
  • 【Go】字符串拼接

    在 Go 语言中 常见的字符串拼接方式包括 拼接 fmt Sprintf拼接 strings Join拼接 buffer Builderbuffer WriteString拼接和strings Builder WriteString拼接 1
  • 什么是to B 业务

    引言 To B or Not to B there is not a question 对于企业而言 数据分析的作用主要体现在三大领域 1 是对业务的改进优化 2 是帮助业务发现机会 3 是创造新的商业价值 数据分析最重要的是基于对业务的理
  • 常见的反爬手段、原理以及应对思路

    应对反爬的主要思路就是 尽可能的去模拟浏览器 浏览器在如何操作 代码中就如何去实现 1 通过User Agent反爬 爬虫发送请求时 请求头中默认没有User Agent 或者提供非正常的UA 应对思路 在请求时添加UA 具体应对 requ
  • 用JAVA实现网络数据包嗅探

    用JAVA实现网络数据包嗅探 网络嗅探可是说是网络开发的一个基础 SNIFFER IDS都是在这个基础上开发的 一个提供了网络分析 一个提供了入侵检测 实现一个网络嗅探程序到底有多难呢 可以很复杂 也可以很简单 在WINDOWS平台下 大多
  • 框架分析(8)-React Native

    框架分析 8 React Native 专栏介绍 React Native 特性和优势 跨平台开发 热更新 原生性能 组件化开发 第三方库支持 社区支持 限制和挑战 性能问题 第三方库兼容性 学习曲线 总结 专栏介绍 link 主要对目前市
  • 大数据开发:数仓建模常见数据模型

    在数据仓库搭建的过程当中 根据需求合理地选择数据模型 是非常关键的一个环节 对于数仓建模 很多人说不就是建表吗 哪有那么复杂 事实上 这是非常错误的思想 今天的大数据开发分享 我们来聊聊数仓建模常见的几种数据模型 目前来说 市场上主流的数据
  • Tomcat性能优化详细教程

    首先 是客户端访问tomcat的一个过程 如图所示 图中间虚线框部分是 Apache基金下的服务器来做静态资源处理的 而这部分需要花费大量时间 当用nginx和tomcat做企业级集群的时候 需要禁用掉AJP协议 一 准备工作 1 配置管理
  • ORACLE在分区表的分区字段上进行更新的方法

    有些业务表 由于数据量比较大 例如成交表 因此 为了方便查询 通常在一个日期字段上对表进行分区用以提高查询效率 但是一旦对表进行分区后 如果要对表中的记录更新 如果更新字段设计到了分区字段 那么update语句就会出错 ORA 10442
  • 学习TCP

    参考知乎 实战 我用 Wireshark 让你 看见 TCP 知乎 zhihu com 学习工具 tcpdump linux wireshark windows dump 转储 json dump a fp 转储到文件 动态数据转储为静态文
  • 关于基本功能测试用例,到底是传统的表格(Excel)形式好还是思维导图(Xmind、MindManager等)模式好?

    这个问题先抛出我的观点 具体选择哪种形式更好 需要根据具体情况来考虑 如果测试用例较为简单 可以选择表格形式 如果测试用例较为复杂 可以选择思维导图形式 但实际工作中 二者一般是结合使用的 想把握好这个度 就需要了解两种用例形式的优缺点 所
  • Windows batch编程常用语法及命令介绍

    1 echo 和 回显命令 关闭单行回显 echo off 从下一行开始关闭回显 echo off 从本行开始关闭回显 一般批处理第一行都是这个 echo on 从下一行开始打开回显 echo 显示当前是 echo off 状态还是 ech
  • 总结5种比较高效常用的排序算法

    1 概述 本文对比较常用且比较高效的排序算法进行了总结和解析 并贴出了比较精简的实现代码 包括选择排序 插入排序 归并排序 希尔排序 快速排序等 算法性能比较如下图所示 2 选择排序 选择排序的第一趟处理是从数据序列所有n个数据中选择一个最
  • 基于stm32驱动bh1750光照传感器的一种超简单的编程方法

    基于stm32驱动bh2750光照传感器的一种超简单的编程方法 目录 基于stm32驱动bh1750光照传感器的一种超简单的编程方法 前言 一 搭载RT thread需要的环境 二 获取RT thread官方源码 并新建一个工程 三 下载b
  • python 编码规范-命名规范

    常见的命名规则 匈牙利命名法 以一至多个小写字母表示其属性 类型 后接首字母大写的一至多个单词表示其作用描述 比如 m bCanRun 其中 m 表示其为成员变量 b 表示其类型为布尔值 CanRun 表示其代表是否可以检查的含义 驼峰命名