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 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 num…...
uniapp h5支付(支付宝和微信支付)
支付宝和微信支付 支付宝 创建一个页面,复制下面即可 <template><view><div class"body" v-html"formUrl"></div></view> </template><script>export default {data() {return {formUrl: // 用于…...

Radamsa:一款高性能通用模糊测试工具
关于Radamsa Radamsa是一款高性能的通用模糊测试工具,广大研究人员可以将其当作一个应用程序稳定性测试的测试用例生成工具。 工具运行机制 该工具使用简单,支持自定义脚本开发,可以用于测试程序对格式错误和潜在恶意输入的承受能力。它的工…...
css中使用data中的变量
一、定义变量 data() {return {myColor:"#2a9efb",}; },二、在templete中激活 说明:这里其实类似于设置 document.documentElement.style.setProperty(--myColor, myColor),而我们现在只是给div设置了变量属性,并且是在当前页面设置的&#x…...

Java 设计模式之策略模式 (Strategy Pattern) 详解
Java 设计模式之策略模式 (Strategy Pattern) 详解 策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,将每个算法封装起来,并使它们可以互相替换,从而使得算法的变化不会影响使用算法的…...
习题20240803(未完成)
文章目录 一、Linq练习 使用Linq完成下面练习1.题目: 返回 numbers 列表中的所有数字。2.题目: 返回 numbers 列表中的所有偶数。3.题目: 返回 numbers 列表中所有大于10的数字。4.题目: 返回 students 列表中所有学生的姓名。5.题目: 返回 numbers 列表按升序排序后的数字。6.…...

C语言程序设计25
《C程序设计教程(第四版)——谭浩强》 习题2.2 分析下面程序的运行结果,然后上机验证。 代码: //《C程序设计教程(第四版)——谭浩强》 //习题2.2 分析下面程序的运行结果,然后上机验证。#inc…...

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

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

grep工具的使用
grep [options]…… pattern [file]…… 工作方式: grep 在一个或者多个文件中搜索字符串模板,如果模板中包括空格,需要使用引号引起来,模 板后的所有字符串会被看作是文件名。 工作结果:如果模板搜索成功…...
Langchain核心模块与实战[9]:RAG检索增强生成[文本向量化、实战ChatDoc智能文档助手]
Langchain核心模块与实战[9]:RAG检索增强生成[文本向量化、实战ChatDoc智能文档助手] 参考文章可以使用国产LLM进行下述项目复现: 初识langchain[1]:Langchain实战教学,利用qwen2.1与GLM-4大模型构建智能解决方案[含Agent、tavily面向AI搜索]langchain[2]:Langchain实战教…...

Java从入门到精通(十五) ~ IO流
晚上好,愿这深深的夜色给你带来安宁,让温馨的夜晚抚平你一天的疲惫,美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 什么是IO流? IO流的作用: 一、基础流 1. 字节流 1.1 字节输入流 FileInputStream 1.2 字节…...

C Primer Plus 第4章——第二篇
你该逆袭了 第4章:重点摘录 五、scanf( )1、使用 scanf( )(1)转换说明 *(2)转换说明 数字(3)转换说明 hh(4)scanf 中其他的转换说明,不作详细解释,用到的时候再去学习即可 2、从 scanf( ) 角度 看 输入3、格式字符串中的普通字符4、scanf&…...
优化海外用户体验,畅通支付路径!来了解WeTest的本地化支付测试方案
在APP出海的全生命周期中,支付系统的稳定运行是至关重要的一环。随着产品服务覆盖地区的拓展、APP内付费功能的拓展以及不同地区用户对多样化支付渠道的需求增加,出海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函数实例演示 前言 在之前,我讲过文件的顺序读写。但是我们可不可以随机读写文件呢&a…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...

Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...