当前位置: 首页 > news >正文

PEP 8 – Python 代码风格指南中文版(五)

强制性:命名约定

应避免的命名

永远不要使用字符‘l’(小写字母el)、‘O’(大写字母oh)或‘I’(大写字母eye)作为单字符变量名。在某些字体中,这些字符与数字1和0难以区分。当想使用‘l’时,改用‘L’。

ASCII兼容性

标准库中使用的标识符必须符合PEP 3131策略部分中描述的ASCII兼容性。

包和模块名称

模块名称应该简短,全部小写。如果可以提高可读性,可以在模块名称中使用下划线。Python包也应该有简短、全部小写的名称,但不建议使用下划线。

当用C或C++编写的扩展模块有一个提供更高层次(例如,更面向对象)接口的Python模块时,C/C++模块应以前导下划线命名(例如,_socket)。

类名称

类名称通常应使用CapWords约定。

在接口已文档化且主要用作可调用对象的情况下,也可以使用函数命名约定。

请注意,内置名称有单独的约定:大多数内置名称是单个单词(或两个连在一起的单词),只有异常名称和内置常量使用CapWords约定。

类型变量名称

在PEP 484中引入的类型变量名称通常应使用CapWords,并倾向于使用简短名称:T、AnyStr、Num。建议为用于声明协变或逆变行为的变量分别添加_co或_contra后缀:

from typing import TypeVar
VT_co = TypeVar('VT_co', covariant=True)
KT_contra = TypeVar('KT_contra', contravariant=True)

异常名称

由于异常应该是类,因此这里适用类的命名约定。但是,你应该在异常名称后使用“Error”后缀(如果异常实际上是一个错误)。

全局变量名称

(希望这些变量仅用于模块内部。)命名约定与函数相似。

设计为通过from M import *使用的模块应使用__all__机制来防止导出全局变量,或者使用较旧的约定,即在全局变量名前加上下划线(你可能希望这样做来表示这些全局变量是“模块非公开的”)。

函数和变量名称

函数名称应小写,必要时用下划线分隔单词以提高可读性。

变量名称遵循与函数名称相同的约定。

只有在已经普遍采用mixedCase风格的上下文中(例如threading.py),才允许使用mixedCase,以保持向后兼容性。

函数和方法参数

对于实例方法的第一个参数,总是使用self。

对于类方法的第一个参数,总是使用cls。

如果函数参数的名称与保留关键字冲突,通常最好添加一个尾随下划线,而不是使用缩写或拼写错误。因此,class_比clss更好。(也许更好的是,通过使用同义词来避免此类冲突。)

方法名称和实例变量

使用方法命名规则:小写,必要时用下划线分隔单词以提高可读性。

对于非公共方法和实例变量,仅使用一个前导下划线。

为避免与子类中的名称冲突,请使用两个前导下划线来调用Python的名称改编规则。Python使用类名来改编这些名称:如果类Foo有一个名为__a的属性,则不能通过Foo.__a来访问它。(一个固执的用户仍然可以通过调用Foo._Foo__a来访问它。)通常,仅当需要避免与子类中的属性名称冲突时,才应使用双前导下划线。

注意:关于__names的使用存在一些争议(请参见下文)。

常量

常量通常在模块级别定义,并全部使用大写字母,单词之间用下划线分隔。示例包括MAX_OVERFLOW和TOTAL。

为继承而设计

始终决定类的方法和实例变量(统称为“属性”)应该是公开的还是非公开的。如果有疑问,请选择非公开的;之后将非公开属性改为公开比将公开属性改为非公开更容易。

公开属性是那些你期望类的无关客户端使用的属性,同时你承诺避免进行向后不兼容的更改。非公开属性则是不打算由第三方使用的属性;你不保证非公开属性不会更改甚至被删除。

我们在这里不使用“私有”一词,因为在Python中(除非进行通常不必要的大量工作),没有属性是真正私有的。

属性的另一个类别是那些属于“子类API”一部分的属性(在其他语言中通常称为“受保护的”)。有些类被设计为可以被继承,以扩展或修改类的行为方面。在设计这样的类时,请小心明确决定哪些属性是公开的,哪些属性是子类API的一部分,以及哪些属性确实仅应由你的基类使用。

考虑到这一点,以下是Pythonic的指南:

  • 公开属性不应该有前导下划线。
  • 如果你的公开属性名与保留关键字冲突,请在你的属性名后添加一个尾随下划线。这比缩写或拼写错误更好。(但是,尽管有这个规则,‘cls’是用于任何已知为类的变量或参数的首选拼写,特别是类方法的第一个参数。)

注意1:请参阅上面关于类方法的参数名称建议。

  • 对于简单的公开数据属性,最好只暴露属性名,而不是复杂的访问器/修改器方法。请记住,Python提供了一种简单的路径来进行未来的增强,如果你发现简单的数据属性需要增加功能行为。在这种情况下,可以使用属性(properties)来在简单的数据属性访问语法背后隐藏功能实现。

注意1:尽量保持功能行为无副作用,尽管像缓存这样的副作用通常是可接受的。

注意2:避免对计算昂贵的操作使用属性;属性符号让调用者相信访问是(相对)便宜的。

  • 如果你的类打算被子类化,并且你有不希望子类使用的属性,请考虑使用双前导下划线且没有尾随下划线的命名方式。这会触发Python的名称改写算法,将类名改写进属性名中。这有助于避免在子类不小心包含同名属性时发生属性名冲突。

注意1:请注意,在改写名称时仅使用简单的类名,因此如果子类选择了相同的类名和属性名,你仍然可能会遇到名称冲突。

注意2:名称改写可能会使某些用途(如调试和__getattr__())变得不那么方便。但是,名称改写算法已经得到了很好的文档说明,并且易于手动执行。

注意3:并非所有人都喜欢名称改写。请尝试在避免意外名称冲突与高级调用者的潜在使用需求之间找到平衡。

公共和内部接口

任何向后兼容性保证仅适用于公共接口。因此,让用户能够清楚地区分公共接口和内部接口是非常重要的。

已文档化的接口被视为公共接口,除非文档中明确声明它们是临时的或内部接口,并免除通常的向后兼容性保证。所有未文档化的接口都应视为内部接口。

为了更好地支持自省,模块应使用__all__属性明确声明其公共API中的名称。将__all__设置为空列表表示该模块没有公共API。

即使__all__设置得当,内部接口(包、模块、类、函数、属性或其他名称)仍应以单个前导下划线为前缀。

如果任何包含的命名空间(包、模块或类)被视为内部,则相应的接口也被视为内部。

导入的名称应始终被视为实现细节。除非它们是包含模块的API中明确记录的一部分(如os.path或包的__init__模块,该模块公开了来自子模块的功能),否则其他模块不得依赖对这些导入名称的间接访问。

相关文章:

PEP 8 – Python 代码风格指南中文版(一)

PEP 8 – Python 代码风格指南中文版(二)

PEP 8 – Python 代码风格指南中文版(三)

PEP 8 – Python 代码风格指南中文版(四)

相关文章:

PEP 8 – Python 代码风格指南中文版(五)

强制性:命名约定 应避免的命名 永远不要使用字符‘l’(小写字母el)、‘O’(大写字母oh)或‘I’(大写字母eye)作为单字符变量名。在某些字体中,这些字符与数字1和0难以区分。当想使…...

Spring中是如何实现IoC和DI的?

前言:在前一篇文章中对于IoC的核心思想进行了讲解,而本篇文章则从Spring的角度入手,体会Spring对于IoC是如何实现的。 如果对IoC还有不太了解的可以阅读上一篇文章,相信一定会带来全新的收获:什么是IoC(控制…...

Excel第33享:借助易用宝将多个表格合并到一个表格

1、需求描述 现有3个销售数据的Excel表格,希望将其整合到一个表格里,如下图所示。 2、具体操作 (1)下载一个插件“易用宝”。 下载地址:最新版下载 | Excel易用宝 如果本地址失效,可以直接百度搜索“易…...

opencascade AIS_TrihedronOwner源码学习对象的实体所有者用于选择管理

opencascade AIS_TrihedronOwner 前言 AIS_Trihedron对象的实体所有者用于选择管理。 在OpenCascade的AIS(交互对象框架)中,管理类似AIS_Trihedron的对象的选择涉及理解如何处理实体(或所有者)以进行选择。 方法 1…...

面试经典算法150题系列-跳跃游戏||

跳跃游戏|| 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 num…...

uniapp h5支付(支付宝和微信支付)

支付宝和微信支付 支付宝 创建一个页面&#xff0c;复制下面即可 <template><view><div class"body" v-html"formUrl"></div></view> </template><script>export default {data() {return {formUrl: // 用于…...

Radamsa:一款高性能通用模糊测试工具

关于Radamsa Radamsa是一款高性能的通用模糊测试工具&#xff0c;广大研究人员可以将其当作一个应用程序稳定性测试的测试用例生成工具。 工具运行机制 该工具使用简单&#xff0c;支持自定义脚本开发&#xff0c;可以用于测试程序对格式错误和潜在恶意输入的承受能力。它的工…...

css中使用data中的变量

一、定义变量 data() {return {myColor:"#2a9efb",}; },二、在templete中激活 说明&#xff1a;这里其实类似于设置 document.documentElement.style.setProperty(--myColor, myColor),而我们现在只是给div设置了变量属性&#xff0c;并且是在当前页面设置的&#x…...

Java 设计模式之策略模式 (Strategy Pattern) 详解

Java 设计模式之策略模式 (Strategy Pattern) 详解 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;旨在定义一系列算法&#xff0c;将每个算法封装起来&#xff0c;并使它们可以互相替换&#xff0c;从而使得算法的变化不会影响使用算法的…...

习题20240803(未完成)

文章目录 一、Linq练习 使用Linq完成下面练习1.题目: 返回 numbers 列表中的所有数字。2.题目: 返回 numbers 列表中的所有偶数。3.题目: 返回 numbers 列表中所有大于10的数字。4.题目: 返回 students 列表中所有学生的姓名。5.题目: 返回 numbers 列表按升序排序后的数字。6.…...

C语言程序设计25

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 习题2.2 分析下面程序的运行结果&#xff0c;然后上机验证。 代码&#xff1a; //《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 //习题2.2 分析下面程序的运行结果&#xff0c;然后上机验证。#inc…...

TypeScript 基础类型与类型声明

前言 在 JavaScript 中&#xff0c;变量是没有类型的&#xff0c;变量的值的类型是在运行时确定的&#xff0c;这被称为动态类型。 这意味着可以在不同的时间将不同类型的值赋给同一个变量&#xff0c;并且 JavaScript 会在运行时根据当前赋给变量的值来确定其类型。 示例&…...

算法:BFS 解决多源最短路问题

目录 多源最短路 题目一&#xff1a;矩阵 题目二&#xff1a;飞地的数量 题目三&#xff1a;地图中的最高点 题目四&#xff1a;地图分析 多源最短路 首先想要知道多源最短路&#xff0c;就先要明白单源最短路&#xff0c;bfs解决单源最短路问题前面学习过&#xff0c;单…...

grep工具的使用

grep [options]…… pattern [file]…… 工作方式&#xff1a; grep 在一个或者多个文件中搜索字符串模板&#xff0c;如果模板中包括空格&#xff0c;需要使用引号引起来&#xff0c;模 板后的所有字符串会被看作是文件名。 工作结果&#xff1a;如果模板搜索成功&#xf…...

Langchain核心模块与实战[9]:RAG检索增强生成[文本向量化、实战ChatDoc智能文档助手]

Langchain核心模块与实战[9]:RAG检索增强生成[文本向量化、实战ChatDoc智能文档助手] 参考文章可以使用国产LLM进行下述项目复现: 初识langchain[1]:Langchain实战教学,利用qwen2.1与GLM-4大模型构建智能解决方案[含Agent、tavily面向AI搜索]langchain[2]:Langchain实战教…...

Java从入门到精通(十五) ~ IO流

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 什么是IO流&#xff1f; IO流的作用&#xff1a; 一、基础流 1. 字节流 1.1 字节输入流 FileInputStream 1.2 字节…...

C Primer Plus 第4章——第二篇

你该逆袭了 第4章&#xff1a;重点摘录 五、scanf( )1、使用 scanf( )(1)转换说明 *(2)转换说明 数字(3)转换说明 hh(4)scanf 中其他的转换说明&#xff0c;不作详细解释&#xff0c;用到的时候再去学习即可 2、从 scanf( ) 角度 看 输入3、格式字符串中的普通字符4、scanf&…...

优化海外用户体验,畅通支付路径!来了解WeTest的本地化支付测试方案

在APP出海的全生命周期中&#xff0c;支付系统的稳定运行是至关重要的一环。随着产品服务覆盖地区的拓展、APP内付费功能的拓展以及不同地区用户对多样化支付渠道的需求增加&#xff0c;出海APP的当地支付体验的优劣直接影响到海外用户的消费决策。 然而海外支付风控升级&#…...

VUE框架面试整理-模板语法

Vue.js 的模板语法允许你声明式地将数据绑定到 DOM。以下是一些常见的模板语法和用法: 插值 插值语法用于在 HTML 中插入数据。 <p>{{ message }}</p>data:...

【C语言】fseek、ftell以及rewind函数(随机文件读写)

文章目录 前言1. fseek1.1 fseek函数原型1.2 fseek函数的形式参数1.3 fseek实例演示 2. ftell2.1 ftell函数原型2.2 ftell函数的实例演示 3. rewind3.1 rewind函数原型3.2 rewind函数实例演示 前言 在之前&#xff0c;我讲过文件的顺序读写。但是我们可不可以随机读写文件呢&a…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学&#xff1f;传统医学奠基期&#xff08;远古 - 17 世纪&#xff09;近代医学转型期&#xff08;17 世纪 - 19 世纪末&#xff09;​现代医学成熟期&#xff08;20世纪至今&#xff09; 中医的源远流长和一脉相承远古至…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...