LeanCloud Python SDK 发布了新版本 1.6.0,增加了对 Python 3 的支持,并且向前兼容 Python 2 的代码。目前开发者可以在这两个环境中使用 LeanCloud 来构建应用。新版 Python SDK 的开发与测试主要在 Python 3.5 下进行,因此希望使用 Python 3 的开发者建议选择 Python 3.5。
另外云引擎 LeanEngine 也支持运行于 Python 3 的应用。开发者需要在项目的根目录下创建一个 runtime.txt
,内容为 python-3.5
,然后使用命令行工具或者在 LeanCloud 控制台进行项目部署,即可将代码运行在 Python 3.5 中。
不过在此之前,请依据以下升级和兼容性检查的提示来确认项目代码和所依赖的第三方模块已经完全兼容 Python 3。
从长远角度来看,Python 2 和 Python 3 虽然会两个版本共存很长一段时间,但是前者一定是会被后者取代,因此在项目代码量相对较小的阶段升级到 Python 3 是一个明智的选择。
另外 Python 3 经过了好几个版本的改进,增加了很多 Python 2 没有的特性,比如 Python 3.5 新增的可选类型标注,这样能杜绝很多之前只有在运行时才能发现的 bug。比如现在你可以写出这样的代码:
def add(x: int, y: int) -> int return x + y
然后配合 mypy ,在开发过程中就可以检测出类似 add('a string', 1)
的 bug。
首先需要在本地机器安装 Python 3.5。Windows 用户可在 Python 官网 下载最新安装包,Mac OS X 以及 Linux 等用户推荐使用相应的包管理软件进行安装。
如果应用是运行在自己的服务器或者客户端等环境上,只要尝试使用 Python 3.5 测试应用即可。
如果使用的是 LeanEngine,需要将命令行工具升级到最新版( npm update -g avoscloud-code
),然后在项目根目录运行 lean up
,命令行工具就会根据 runtime.txt
中的内容使用相应版本的 Python 来运行应用,之后根据出错提示(如果有的话)来修改代码即可。
目前 runtime.txt
可以有两个选项: python-2.7 或者 python-3.5 ,如果没有此文件的话就默认为 python-2.7 。之后命令行工具会根据指定来调用 python2.7
或者 python3.5
命令启动项目。如果系统当前路径中没有这两个命令,则会回退到调用 python
来启动项目。对于 Linux / Mac OS X 用户来说这里没有任何问题,只要保证安装了指定的 Python 版本即可。但是对于 Windows 用户,目前 Python 安装包安装完成之后,并不会创建 python3.5
这个命令,因此需要自己确保系统中的 python
命令为自己需要的版本。
注意:LeanEngine 使用 geventwebsocket
这个模块来实现对 websocket 的支持,但是此模块暂时不支持 Python 3, 所以如果需要使用 websocket 请暂时不要升级。 另外也请检查一下 wsgi.py
,移除 geventwebsocket
的相关部分代码。
print
现在是一个函数而不是语句 这项不兼容需要做的修改很简单,只要在所有的 print
后面的参数上加上括号就好了,比如:
print 'Hello LeanCloud!'
需要改为:
print('Hello LeanCloud!')
unicode
类型,而非之前的 str
类型 如果之前的代码字符串前缀都有 u
,那现在可以去掉它了(保留也没有任何问题)。但是如果没有任何前缀,这时候就需要根据情况做处理了。这里有一个简单的原则:
没有明确原因的情况下,程序内部统一都是用 unicode
表示字符串。程序与外部沟通时,使用相应编码(通常是 utf-8
)的 bytes
(即 Python 2 中的 str
)来表示字符串。
如果按照这个规则在 Python 中处理字符串一般不会遇到什么问题。另外很多 Python 的库以及框架会在跟外界沟通时自动将 unicode
做了编码,这时候就不需要自己进行处理了。
xrange
等返回迭代器的对象的函数被移除 之前大家都知道 Python 一个常见的内存优化方法是使用 xrange
来代替 range
,这样返回的结果是一个迭代器对象,每次迭代都会惰性地返回内容,并不会造成太大的开销。现在 Python3 中取消了这个方法,并将原来的 range
函数改为了相同的行为,现在只需要修改函数名称即可。
另外如果有大量的代码需要修改的话,可以考虑在每个文件最前面加上一行 xrange = range
以维持兼容。
还有 file 对象上的 xreadlines
等函数也是相同的行为。
之前 Python 2.7 支持如下两种异常捕获方式:
try: awesome_thing.save() except LeanCloudError, e: do_some_thing_with(e)
以及
try: awesome_thing.save() except LeanCloudError as e: do_some_thing_with(e)
现在 Python 3 中只可以使用后者。
关于这项改动可能需要谨慎修改代码了,因为它并不会引起语法错误,而是直接改变了代码执行的行为。不过如果之前的代码中所有的除法都是使用 10 / 3.0
而不是 10 / 3
的话,就不会受到影响。
如果希望继续使用整除,可以使用 //
这个操作符替换之前的 /
除法操作符。
更多关于 Python 2 与 Python 3 的差异,请参考 Segmentfault 文章 · Python 2.7.x 和 Python 3.x 的主要区别 。
目前命令行工具还不支持创建 Python 3 的项目,我们会在近期增加这部分支持。目前如果开发者需要创建以 Python 3 为运行时的新项目的话,可以直接 clone 或者下载 Github 仓库 · python-getting-started 的 python3 分支的代码来用作应用的初始代码。
最后我们期待听到大家对于这一新版本的反馈,请通过社区论坛 和 工单 来与我们分享您的体验和感受。