Quantcast
Channel: CodeSection,代码区,Python开发技术文章_教程 - CodeSec
Viewing all articles
Browse latest Browse all 9596

用惨痛的经历告诉你Python奇葩语法:代码缩进不是为了排版

$
0
0
用惨痛的经历告诉你python奇葩语法:代码缩进不是为了排版

2天前来源:CPP程序员

[摘要]鉴于没有全面学习Python语法,就直接使用Python语言编程,被Python的潜规则给狠狠的打了一巴掌。不过,最后发现问题,也是一番探索得来,虽然辛苦,但是也很快乐。Python的缩进并不是为了排版哦。 今天要来说一下Python的一个语法规定,那就是代码缩进。今天被这个坑了一阵子,所以来说说经过。

因为项目需要,接触到了Python。然而我不得不吐槽一下Python。


php?url=0E7WFZzYPr" alt="用惨痛的经历告诉你Python奇葩语法:代码缩进不是为了排版" />
我现在做的后台服务器,使用C++写的核心库,然后透接给Python调用。我们服务器的架构是Nginx+uwsgi+Python+C++。 服务器的基本结构就是:C++写服务器核心功能库,Nginx作为服务器,来接受请求,然后借助插件uwsgi来支持web。为什么用Nginx呢?因为Nginx的高并发性能比Apache强10倍。Nginx将请求传递给uwsgi来处理web。作为Web服务器,必然需要一个后台处理语言程序来处理web请求。Asp.net后台可以是VB脚本也可以是C#。PHP后台则是php。我们这里的Nginx后台选择的是Python。Python、php、VB脚本一样,都是脚本语言。而C#则是编译型语言。所以在后台处理web的请求,uwsgi将Nginx转发过来的请求,做一个处理,然后再传递给Python脚本文件处理。Python脚本文件以py结尾,处理后会生成pyc文件,算是编译过的脚本文件。然后Python就可以和C++提供的库直接对接,Python调用C++导出的库函数,来完成核心功能。也就是说,Python只是做web的逻辑处理,真正的核心功能,都在C++程序里。 这样的架构,你感觉到了什么?哈哈哈,C++也是可以做网站滴,而且这样的架构,性能非常强悍!现在大服务器很多都采用Nginx了,再加上C++代码的高效,简直太赞了。是不是又一次感受到C++的用武之地了呢?! 好了,现在要是的就是Python处理的逻辑。Python处理Web逻辑,然后直接输出结果html结果,从而实现网页的动态交互。Python是脚本语言,所以工作机制和PHP是一样的。Python和PHP都是解释性语言,读取一条代码,执行一条代码,只要前面的是正确的就可以正确的执行,直到遇到Bug再崩溃。而asp.net的程序,则是编译型的,和C++一样的,需要提前编译好,所有代码没有语法错误才行。 然后今天发现一个问题,就是添加数据的时候,网页崩溃了,错误提示为500,即服务器内部错误,也就是服务器端的程序错误。咋一看,应该是代码问题。所以,就开始着手干了。 因为问题是从前端网页发生的,所以,为了定位问题,先去定位产生问题的位置,也就是一个按钮提交数据,然后结果服务器程序崩溃。所以,就去找按钮,然后定位到提交数据的js代码,然后再定位到js代码中提交的函数,根据函数名,确定了后台的Python页面文件,即py结尾的文件。 从这一步开始,前后台就链接起来了,可以进行联调,即同时看前端页面和后台这个页面的程序。通过火狐浏览器的web开发人员工具的调试器,和VS一样打断点,然后F10一步步的单步跟进,确定了传递的参数,发现和修改及删除的参数一样,所以排除问题。问题不再前端,即前端提交的数据是正确的。 然后就是跟进后台的Python程序。在网站后台,要想调试,可不能向前台一样在浏览器调试,而且是在线运行状态,不太好搞。这和linux开发的嵌入式程序一样,不方便调试。所以大家通常用的一种方法就是打日志。将相关信息自己加写日志的代码写到文件中去,然后从文件中去查看各个代码的执行情况。这一方法非常的有用。我们在VS开发的时候,那调试功能太强大了,对于开发来说,极大提高了开发效率。而此时只能用日志方式调试了。 好吧,既然要写日志,那就要在Python文件中加代码。python写文件的代码,并不难,你不会,随便在网上查一下资料,就有了。而且,函数用法和C语言差不多。其实我并没有去学过Python,而只是看着Python的现有代码去推测语法,然后仿照着些,然后一些特定的函数,就查一下。就这样写好了代码,加到了python代码中。然后保存,测试。 回到网页,因为之前报的错,提供了一个返回主页的按钮,然后就回了主页。主页有一个图表走势控件,会定期刷新,从后台取数据,也就要执行一下刚改的页面的程序。这样一进入主页,挂了,也是500的服务器程序错误。这让我好郁闷,明明代码都是正确的,竟然出现这样的问题。我以为是代码哪里不对,然后将写入文件的内容固定,不用参数,然后保存,还是挂了。好吧,那我再将写文件的函数直接注释了,回去看,还是挂了。然后我直接将写日志的代码都撤了,恢复原样,结果正常了。 我看了几遍网上的资料,代码真的没有错哦。这让我情何以堪。我百思不得其解,但是问题必须解决。虽然已经下班了,但是问题不解决,不想下班。 然后我静静的看,就看着,死死的看着这些代码,就不信看不出来。然后我继续仿照原有的代码来写吧。现在连缩进也仿照,所以,代码和原有代码对齐。然后看看效果,反正此时也没有其他办法,试试看。然后回去看主页,正常!当然,此时那个提交数据的页面还是有问题。主页导致的不正常是一个插曲。 这样有了效果,我再故意将代码又不对齐,然后再看效果,果不其然,主页又挂了。然后我就感觉到,Python中,缩进不一般呀。然后再后面的调试中,遇到缩进的时候,都和原有代码一样缩进。主页就没有出现问题,这样我有一种深深的探索的喜悦。偶尔在粘贴一行代码的时候,少了一个空格,也就没有对齐,竟然报错。此时的我已经很淡定,迅速对齐后,没有问题了。 Python这个对齐问题,耽误了一些时间。然后再后续调试完后,下班回来,吃完饭,已经是晚上9点了。然后回来后,我迅速去求证一个问题,那就Python的缩进问题。我可以推测,Python的缩进是作为语法规则的一部分,而不是C/C++那样的一个排版而已。 然后查询到的解释是:“Python中,是通过代码的缩进,来决定代码的逻辑的。通俗的说,Python中的代码的缩进,不是为了好看,而是觉得代码的含义,上下行代码之间的关系。缩进弄错了,就会导致程序出错,执行结果变成不是你想要的了。”。这样的解释,和我遇见的现象完全一致,和我推测的一样。 所以我不得不感慨到,Python语法真是奇葩,如果不注意,绝对会坑死你。当然,这是会像我这样的,没有全面去学习Python语法,而直接使用Python的人,才会遇到。当然,不排除习惯了C/C++的语法,刚开始学习Python的人也会遇到。而我用惨痛的经历验证了这一个语法。相信我要很久到不会忘记这个语法吧。 至于提交数据那个问题,我另外写一篇文章来解释,后面证明是一个数据库引发的问题,而且,这个问题绝对是你意想不到的问题,所以,也让我很意外。

Viewing all articles
Browse latest Browse all 9596

Trending Articles