开发环境一致性很重要;
更重要的是版本号要一致;
尤其Python版本号。
为什么?
你以为3.4.0和3.5.0没多大区别吗?
区别只有踩过了才知道
背景
业务需求
开发一个很常见的注册时候的那种行政区域级联菜单并支持搜索。比如,选了中国,然后就返回中国下的所有省份,依此类推。
业务实现
实现逻辑,查询数据库,根据客户已有的选择,限定条件,返回下一级菜单结果
代码发布
本地测试没有问题后,撰写相关接口文档,代码合并到stage测试环境
问题出现
登陆测试环境的Web端,出现点击登录无法请求成功,直接option请求都返回了500(internal server error)
一头雾水
代码实现部分和登录部分并没有任何交集啊。
但是,有问题就解决问题,但解决问题前,赶紧回滚到上一版本,我可不想一堆人@我
着手分析
好吧,只有我动了代码,这个bug非我莫属了。
开始我的debug之旅:
代码再review
打开postman,一顿的发送请求到本地服务端,everything is normal
可以确定的是我的代码我的崽没问题
还有什么可能呢?
咦,出问题的最终代码是在服务器上有问题
那么,是不是服务器环境有问题?
服务器环境
在服务器中,最好的办法就是直接python run.py同时开启DEBUG模式
刷刷刷的跑起来,
最后,
跪了
出现重要的提示:1
SyntaxError: only named arguments may follow *expression
可以确定是服务器环境的问题了
到底哪个环境问题?
在服务器中,存在很多服务,确定是哪个服务的问题显得尤为重要。
在执行python run.py出现了语法错误
使用的服务是Python
难道是Python的问题?
有什么问题导致Python语法错误呢?
本地Python运行好好的,线上Python语法错误
难道是版本不一样?
两边终端敲入python –version
本地Python版本:1
2python --version
Python 3.6.6
线上Python版本:1
2python --version
Python 3.4.0
可以确定是Python版本不一致导致语法错误
环境搭建
服务器的环境服务进程之间存在千丝万缕的关系,我不可能把线上的Python版本升级到和我本地的一样(太多不可抗拒因素),那么我迁就线上的版本,把本地的的版本降级。
原形毕露
在我把本地的Python版本由3.6.6指定为3.4.0之后,Pycharm IDE 为我指出原因所在,代码出现了红色下划线。
从上面的报错来看:
我本地之前使用了3.6.6,表达式运行没问题。但线上的为3.4.0,**低于3.5的Python关于表达式的要求是*表达式必须放在最后一个参数。**1
2
3
4
5import random
random_list = [random.randint(0, i) for i in range(10)]
print(*(random_list), 'RidingRoad is foolish')
# 低于Python3.5.0的版本会语法错误
经验总结
环境一致性
如果我一开始,本地就和线上的Python环境一致,就不会出现这种问题了。所以,大家也确认一下线上的版本和自己本地开发的版本号一致,而不是2和3的版本,是要3系列的版本号也一样。
语法知识
这种语法错误,谁知道会存在呢?
好了,学到一招了
3.5以前的*表达式必须放最后一个,3.5以后随便放。通用的就是*表达式都把它放最后一个。