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…...
使用 Elastic Observability 中的 OpenTelemetry 进行基础设施监控
作者:来自 Elastic ISHLEEN KAUR 将 OpenTelemetry 与 Elastic Observability 相结合,形成应用程序和基础设施监控解决方案。 在 Elastic,我们最近决定全面采用 OpenTelemetry 作为首要的数据收集框架。作为一名可观察性工程师,我…...
征服数据结构中的时间和空间复杂度
目录 时间复杂度推导大O方法求解时间复杂度的方法普通顺序结构单循环双循环递归Master定理(主定理)递归树方法 空间复杂度 一个算法的好坏根据什么来判断呢?有两种一种是时间效率,一种是空间效率。时间效率也可称为时间复杂度&…...
springboot Security vue
在使用Spring Boot Security与Vue.js构建前后端分离的应用时,你需要处理几个关键的技术点,包括认证(Authentication)和授权(Authorization),以及如何处理跨域请求(CORS)、…...
13. 计算机网络HTTPS协议(一)
1. 前言 在上一章节中我们介绍了 HTTP 协议相关的面试题目,作为 HTTP 协议的扩展,HTTPS 协议也经常被面试官提起。 因为对于大部分的前端、后端开发者,都接触不到 HTTPS 协议的开发场景,因为我们往往只关注请求路径后缀,例如关注 URL: /get/username,而非路径全称 htt…...
Bean的作用域和生命周期
Bean的作用域 我们先来看下面这段代码 首先是一个Dog类 (此处使用lombok来完成setter、getter、toString方法) Setter Getter public class Dog {private String name;} 然后在DogBeanConfig类里面写一个返回Dog的方法,并将这个方法的返…...
【Qt】QMainWindow之菜单栏
目录 一.菜单栏 1.概念 2.组成 二.代码创建菜单栏 1.创建菜单栏 2.在菜单栏中添加菜单 3.在菜单中添加菜单项 三.图形化创建菜单栏 1.在打开Qt自带的ui文件界面后,得到以下界面 2.双击点击界面中(在这里输入),在菜单栏中进行…...
uni-app封装组件实现下方滑动弹出模态框
子组件 <template><div class"bottom-modal" :class"{show: showModal}"><div class"modal-content" :class"{show: showModal}"><!-- 内容区域 --><slot></slot></div></div></…...
MATLAB(15)分类模型
一、前言 在MATLAB中,实现不同类型的聚类(如K-means聚类、层次聚类、模糊聚类)和分类(如神经网络分类)需要用到不同的函数和工具箱。下面我将为每种方法提供一个基本的示例代码。 二、实现 1. K-means聚类 % 假设X是…...
非虚拟机安装Centos7连接wifi并开机自动联网
一:确认网卡名称 ip addr 无线网卡是以 w 开头,确定是wlp4s0 ,有的是 wlp5s0 二:配置网络 wpa_supplicant -B -i wlp4s0 -c <(wpa_passphrase "网络的名字" “网络的密码“) 设置自动分配IP dhclient wlp4s0 三&…...
怎么选择的开放式耳机好用?2024超值耳机分享!
耳机在当前数字化时代已成为我们生活、娱乐乃至工作中的重要部分。随着市场需求的增长,消费者对耳机的期望也在提高,他们不仅追求音质的卓越,还关注佩戴的舒适度和外观设计。虽然传统的入耳式和半入耳式耳机在音质上往往能够满足人们…...
mac apache wordpress/百度一下 你就知道首页
El Capitan 才发布了将近两个月的时间,现在下一代操作系统的传闻已经出来了。你希望看到哪些新特性?自从抛弃大型猫科动物之后,OS X 的命名规律转向了知名景点。首先是 2013 年的 Mavericks,这是一个北加州的知名冲浪地点…...
常宁网站建设/查网站权重
这个学期的第一个星期即将过去,发现即将过去的第一周里,过的还算充实,希望这中习惯继续保持下去。 针对软件工程这门课程,我打算更加的投入时间和精力,放在上面,相信这个学期也将会是自己编程能力明显提高的…...
企业所得税是指什么/成都关键词优化报价
点击上面“蓝字”关注我们 本专辑持续更新,欢迎关注。本着学习的心,希望和大家相互交流,一起进步!一、手写数字识别简介手写数字识别是一个非常经典的图像分类任务,经常被作为深度学习入门的第一个指导案例。相当于我…...
环企优站网站建设/腾讯云域名
在阅读goim源代码的时候, 在ring.go中看到这句代码: // 2^N if num&(num-1) ! 0 {// ... }原来这是判断2的N次方。 然后总结了下, 判断一个数n是否为2的N次方的办法(要求n>0): 第一种:笨办法, 2^i࿰…...
网页制作网站源码/seo站长综合查询
数组的插入排序 如果是数组的插入排序,则数组的前面部分是有序序列,每次找到有序序列后面的第一个元素(待插入元素)的插入位置,将有序序列中的插入位置后面的元素都往后移动一位,然后将待插入元素置于插入…...
无锡开发网站建设/网站快速收录付费入口
就在上个月中旬,技术老大让我招两个1-2年的iOS开发,把简历的筛选和第一轮技术面试的任务交给了我。 从筛选第一份简历,准备面试题,到成功招到两个人一共花了两个星期多一点,总体来说还是比较顺利的。两位通过者都比较稳…...