百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Python如何解析空格 python中空格的用法

bigegpt 2024-10-12 05:00 10 浏览

Python的语法中最独特且引人注目的特点之一就是其对空格的使用。如果你曾经尝试为Python或类似语言编写解析器,你可能会对其语法感到有些困惑。最近,我将Gypsum编译器的布局分析替换为了采用Python风格的空格解析器,因此我想分享一下我所学到的内容。

Python中的空格的含义

Python使用空格有两个目的:换行符用于终止逻辑行,缩进的变化则用于界定代码块。这两种行为在一定程度上是有上下文关联的。

Python区分物理行与逻辑行。物理行是实际的文本行,由一串字符组成,并以换行符结束。逻辑行是一个语法实体,可以是一个语句或定义的一部分。如果通过反斜杠转义或在括号或方括号的嵌套中出现换行符,多个物理行可以连接成一个逻辑行。



逻辑行起始处的缩进在语法上具有重要意义。如果一行开头的缩进空格数比前一行开头的空格数多,那意味着一个代码块的开始。如果空格数较少,则意味着可能结束了多个代码块。只有逻辑行开头的缩进空格数才会影响代码块的结构;续行无法开启或结束一个代码块。在结束一个代码块时,缩进空格数必须与之前某个缩进级别相匹配。



空格的优缺点

对于空格的使用,已经有很多讨论,我并不想陷入无谓的争论,但我想强调几点。显著的空格意味着不再需要分号和成对的大括号。在我看来,这使得代码更易读,因为语法噪音更少。摆脱了一长串闭合大括号的情况会让人感到愉悦。当然,这是个人口味的问题。更重要的是,使用错误缩进的代码会被解释器拒绝执行,因此可以避免编写格式错误的代码。对于不强制统一编码风格的团队来说,这可能是保持代码可读性的唯一途径。

当然,也存在一些缺点。在Python中,使用自动格式化工具更加困难,因为你需要正确输入空格。在Go语言中,你可以随意编写一段代码而不必担心对齐问题,然后在保存文件时让gofmt工具处理对齐。对我来说,Python最大的问题是没有多行lambda表达式。如果你进行函数式编程或想将回调函数传递给异步函数,你可能需要将一个多行的lambda表达式作为参数传递。在其他语言中,这个lambda表达式可能会有几行长。



其他一些语言(如Kotlin、Swift、Ruby)提供了特殊的语法来将代码块作为最后一个参数传递给函数。然而,在Python中添加类似的语法糖可能会很困难,因为没有大括号的存在,这样的代码可能难以阅读。

Python的解析过程

Python的解析过程涉及词法分析器(lexer)和语法分析器(parser)。词法分析器将代码分解为标记(关键字、标识符、数字等),而语法分析器将这些标记组装成抽象语法树。词法分析器还处理空白字符,并生成特殊的标记:NEWLINE、INDENT?和DEDENT?。语法分析器使用这些标记来确定逻辑行的结束以及块的开始和结束。

词法分析器的工作原理如下:它首先处理换行符。换行符可以是LF?字符或CR LF?序列,表示物理换行。如果换行符位于只有空白字符或注释的行末,词法分析器将忽略它。词法分析器还会跟踪未闭合括号('('?、'['?、'{'?字符)的数量,如果有未闭合括号存在,换行符将被忽略。反斜杠转义的换行符也会被忽略。如果换行符不满足以上任何一种情况,词法分析器将生成一个NEWLINE?标记,表示逻辑行的结束。

接下来,让我们来讨论缩进。词法分析器使用一个标志atbol?来指示是否位于行的开头。该标志在词法分析器初始化时设置,并在发出每个NEWLINE?标记后重新设置。当atbol?被设置时,词法分析器会计算行开头的空白列数。对于缩进的目的,空行会被忽略,但注释不会。空格字符计为一列,制表符则按照8的倍数计算。词法分析器将列数与缩进栈的顶部元素进行比较,每个嵌套块都有一个缩进计数。如果列数相等,表示缩进没有改变。如果列数更大,词法分析器生成一个INDENT?标记,并将列数压入缩进栈中。如果列数较小,词法分析器从栈顶弹出计数,直到找到相等的列数。如果没有找到相等的列数,则报告错误。词法分析器会为每个弹出的计数生成一个DEDENT?标记。

在处理制表符和空格之间的一致性时,Python维护两个并行的列计数和缩进栈。col?表示制表符按8列计算的列数,altcol?表示将制表符视为1列的备用列数。进行缩进比较时,需要同时匹配col?和altcol?。尽管仍可能存在一些不一致性,但这种设计可以在不同环境中保持一致性。然而,有些人对此进行了反对,认为这种处理方式会导致在括号内无法编写类似多行lambda函数的代码。这确实是一个限制,特别是在异步Python代码中,这是一个重要的用例。这个问题在Gypsum中得到了解决,但也引入了复杂的模式匹配规则和错误处理。

总的来说,Python的空白字符处理方式在很多情况下非常方便。然而,在某些特定的使用情况下,这种处理方式可能会受到限制。

评论

自从我第一次学习Python以来,我一直喜欢它将空白字符纳入语法的方式。我在Gypsum中实现了类似的空白字符处理,并且一直对其他语言为什么没有采取相同的处理方式感到惊讶。直到我开始研究本文并阅读有关多行lambda函数的内容,我才真正理解为什么会有人反对它。

真正的问题在于换行符在括号内的规则与缩进的交互方式。这导致你无法在函数调用参数中编写类似多行lambda函数的代码,而这正是你真正需要的情况。虽然我没有写过太多的异步Python代码,所以我从未真正遇到过这个问题,但它似乎是一个非常重要的使用案例,我不确定是否愿意在Gypsum中放弃这一点。如果你希望在括号内使用NEWLINE?、INDENT?和DEDENT?,你需要一种语法感知的方法,这正是Gypsum的布局分析所做的。然而,这会导致一系列复杂的模式匹配规则,并产生许多难以理解的错误。Python之禅中说:“显式优于隐式”,“简单优于复杂”。也许这同样适用于这种情况。

相关推荐

或者这些Joplin插件也可以帮助你的笔记应用再一次强大

写在前面距离上次分享《搭建私有全平台多端同步笔记,群晖NAS自建JoplinServer服务》已过去一段时间,大家是否开始使用起来了呢?如果你和我一样已经使用过Joplin有一段时间了,那或许你也会...

Three.JS教程4 threejs中的辅助类

一、辅助类简介Three.js提供了一些辅助类(Helpers)以帮助我们更容易地调试、可视化场景中的元素。ArrowHelepr:创建箭头辅助器;AxisHelper:创建坐标轴辅助器;BoxH...

第2章 还记得点、线、面吗(二)(第二章还能敲钟吗)

glbgltf模型(webvrmodel)-gltf模型下载定制,glb模型下载定制,三维项目电商网站在线三维展示,usdz格式,vr模型网,网页VR模型下载,三维模型下载,webgl网页模型下载我...

如何检查Linux系统硬件信息?从CPU到显卡,一网打尽!

你可能会问:“我为什么要关心硬件信息?”答案很简单:硬件是Linux系统的根基,了解它可以帮你解决很多实际问题。比如:性能调优:知道CPU核心数和内存大小,才能更好地调整程序运行参数。故障排查:系统卡...

SpriteJS:图形库造轮子的那些事儿

从2017年到2020年,我花了大约4年的时间,从零到一,实现了一个可切换WebGL和Canvas2D渲染的,跨平台支持浏览器、SSR、小程序,基于DOM结构和支持响应式的,高...

平时积累的FPGA知识点(6)(fpga经典应用100例)

平时在FPGA群聊等积累的FPGA知识点,第六期:1万兆网接口,发三十万包,会出现掉几包的情况,为什么?原因:没做时钟约束,万兆网接口的实现,本质上都是高速serdes,用IP的话,IP会自带约束。...

芯片逻辑调度框架设计 都需要那些那些软件工具

设计芯片逻辑调度框架通常需要使用以下软件工具:1.逻辑设计工具:例如Vivado、Quartus、SynopsysDesignCompiler等,用于设计和实现逻辑电路。2.仿真工具:例如Mo...

ZYNQ与DSP之间EMIF16通信(正点原子领航者zynq之fpga开发指南v3)

本文主要介绍说明XQ6657Z35-EVM高速数据处理评估板ZYNQ与DSP之间EMIF16通信的功能、使用步骤以及各个例程的运行效果。[基于TIKeyStone架构C6000系列TMS320C6...

好课推荐:从零开始大战FPGA(从零开始的冒险4399)

从零开始大战FPGA引子:本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“...

业界第一个真正意义上开源100 Gbps NIC Corundum介绍

来源:内容由「网络交换FPGA」编译自「FCCM2020」,谢谢。FCCM2020在5月4日开始线上举行,对外免费。我们有幸聆听了其中一个有关100G开源NIC的介绍,我们对该文章进行了翻译,并对其中...

高层次综合:解锁FPGA广阔应用的最后一块拼图

我们为什么需要高层次综合高层次综合(High-levelSynthesis)简称HLS,指的是将高层次语言描述的逻辑结构,自动转换成低抽象级语言描述的电路模型的过程。所谓的高层次语言,包括C、C++...

Xilinx文档编号及其内容索引(部分)

Xilinx文档的数量非常多。即使全职从事FPGA相关工作,没有几年时间不可能对器件特性、应用、注意事项等等有较为全面的了解。本文记录了我自使用Xilinx系列FPGA以来或精读、或翻阅、或查询过的文...

Xilinx Vivado联合Modelsim软件仿真

引言:Xilinx公司Vivado开发软件自带仿真工具,可以实现一般性能的FPGA软件仿真测试,其测试执行效率以及性能都不如第三方专用仿真软件Modelsim强。本文我们介绍下如何进行Vivado20...

体育动画直播是怎么做出来的?从数据到虚拟赛场的科技魔法!

你是否见过这样的比赛直播?没有真实球员,却能看梅西带球突破?足球比赛变成动画版,但数据100%真实?电竞比赛用虚拟形象直播,选手操作实时同步?这就是体育动画直播——一种融合实时数据、游戏引擎和AI的...

Dialogue between CPC and political parties of neighboring countries held in Beijing

BEIJING,May26(Xinhua)--TheCommunistPartyofChina(CPC)inDialoguewithPoliticalPartiesof...