百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python如何解析空格(python处理空格)

off999 2024-10-09 14:01 63 浏览 0 评论

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之禅中说:“显式优于隐式”,“简单优于复杂”。也许这同样适用于这种情况。

相关推荐

删除数据恢复(删除数据恢复出厂设置)

1.在手机上下载手机数据恢复精灵,进入软件之后,选择微信恢复。2.点击开始恢复,选择需要恢复的联系人,等待一会儿,就能看到恢复好的聊天记录。3.可以安装打开互盾安卓恢复大师,手机数据线连接手机后,点击...

复制粘贴不了怎么解决(电脑不能复制粘贴了怎么处理)

1、查看手机输入法的剪贴板选项,是否有复制的文本,如果有就直接点击就可以直接输入了。2、复制后,长按不出来粘贴键的时候,需要把应用程序关闭掉重新开,重新复制粘贴,或者尝试重启手机。3、可以尝试重新复制...

u盘被写保护去除步骤(u盘的被写保护怎么解除)

U盘被写保护通常是因为存储器故障、病毒感染、文件系统损坏等原因导致的,但可以通过以下几种方法进行解除:1.检查U盘开关:一些U盘可能会有物理上的写保护开关,将其关闭即可解除写保护。2.使用命令行清...

电脑蓝屏怎么用u盘重装系统(电脑蓝屏重装系统教程u盘)

U盘装系统步骤:1.制作U盘启动盘。这里推荐U启动U盘启动盘制作工具,在网上一搜便是。2.U盘启动盘做好了,我们还需要一个GHOST文件,可以从网上下载一个ghost版的XP/WIN7/WIN8系统,...

erp管理软件(erp管理软件免费版)
erp管理软件(erp管理软件免费版)

用友的ERP应该说从3万-3000都有ERP的价格随着企业的规模不同,价格也是不一样的。因为企业规模不同产生的效果也是不一样的,所以用友的产品分T1/T3/T6/U8/U9/NC3万小企业做个财务业务一体化还是勉强可以做的。只...

2025-11-11 09:03 off999

笔记本启动黑屏怎么回事(笔记本启动黑屏没反应)

笔记本开机后黑屏最常遇到的一种情况:因随便点击垃圾网站而导致电脑中脑或受到木马的侵袭,致使电脑系统瘫痪,解决的办法就是重装电脑系统,装好系统后安装查毒软件,定期对电脑进行杀毒全盘扫描,然后平时尽量不要...

win7系统怎么开wifi热点(win7如何开wifi热点)

 1、首先确认你的无线网卡开启。在开始菜单中依次找到“所有程序”--“附件”--“命令提示符”,右键“以管理员身份运行”;   2、在“命令提示符”里输入“netshwlans...

无线路由桥接设置方法(无线路由器无线桥接设置)

1、首先在电脑上输入并登录第一台路由器的IP地址。2、进入路由器管理界面之后,点击“无线设置”,然后点击基本设置中设置“SSID号”,接着点击“信道”,然后设置固定信号道。3、返回无线设置菜单栏,选择...

win10企业版激活命令(win10企业版cmd激活命令)

关于这个问题,Windows10企业版可以通过以下方法进行激活:1.使用企业版密钥激活:如果你已经有了Windows10企业版的密钥,可以在“设置”中的“更新和安全”中选择“激活”来输入密钥进行...

如何恢复备份数据(备份的数据怎么恢复到手机上)
如何恢复备份数据(备份的数据怎么恢复到手机上)

把备份删了的话,一键还原目前是用不了的。现在唯一的办法,是从网上下载一个数据恢复类的软件,只要的备份还没有被别的软件覆盖,是应该可以数据恢复回来的。不能保证百分之百得成功,但是恢复几率还很大的,你可以试试,操作方法首先点击手机“设置”。然后...

2025-11-11 06:51 off999

笔记本无线网卡怎么使用(笔记本无线网卡怎么使用教程)

笔记本无线网卡设置;第一:你要确定你的本本是否有无线上网功能,如果没有就得加个无线网卡;第二:有的话就打开无线网络接受开关;第三:程序设置主要就是在网上邻居的属性里,打开无线上网打开“网上邻居”的“属...

鲁大师电脑版官方下载(鲁大师电脑版官方下载安装)

因为鲁大师是跑分软件,它会拖慢电脑的运行速度,还会占据大量的内存,如果你的电脑配置不是太好的话,装了鲁大师只会雪上加霜,非但得不到任何优化作用,还会拖慢电脑的启动速度,造成不必要的损耗。玩游戏都会卡顿...

win10怎么开机进入安全模式(win10开机怎么进安全模式怎么进)

进入Windows10安全模式有以下几种方法:方法一:使用开机高级选项1.在按下电源开机键后,持续按住F8键,直到你进入启动选项页面;2.从菜单中选择“安全模式”。方法二:使用系统配置1...

华硕电脑怎么重新安装系统(华硕电脑怎么重新安装系统教程)

第一步:备份重要数据重装系统前,务必先备份重要的个人数据。你可以将数据保存在外部存储设备上,或者使用云存储服务,确保数据安全可靠。第二步:下载系统镜像为了重装系统,你需要下载华硕笔记本电脑适用的操作系...

电脑显示此windows副本不是正版

1、第一步在电脑搜索框搜索命令提示符,鼠标右键以管理员的身份运行,2、第二步以管理员身份进去命令提示符之后输入"SLMGR-REARM",3、第三步按回车键可以看到命令已经成功重启一下...

取消回复欢迎 发表评论: