直播预约通道开启!2021腾讯数字生态大会邀您共探产业发展新机遇! 了解详情
写点什么

为什么你现在必须迁移到 Python 3?

2020 年 3 月 17 日

为什么你现在必须迁移到Python 3?


从 Python 2 迁移到 Python 3,只剩不到 1 个月的时间。幸运的是,迁移工作没想象中那么困难。


Python 2 不再受支持

众所周知,对 Python 2 的支持将在 2020 年初停止。不管怎样,“板上钉钉”的是,最后一个主要的 2.7.x 版本将在 2020 年 4 月发布。之后,针对 Python 2 的所有开发都将停止,这意味着不再有安全更新


目前,许多包的维护者都已迁移到 Python 3。其中,有些仍然支持 Python 2,而其他的则已经放弃。2020 年 4 月后,大多数软件包将停止支持 Python 2


据悉,Python 3.0 发布于 2008 年 12 月 3 日。没错,我们曾有足够时间进行迁移。如果现在还没有行动,那就应该把它放在第一。你至少应该在 2020 年结束前迁移到 Python 3,否则就要面临各种风险,比如漏洞、无法运行的软件等。


如何查看你正在运行的版本

如果不知道正使用的 Python 版本,你可以用下面的命令查看当前的 Python 版本:


$ python --versionPython 2.7.16
复制代码


它适用于任何操作系统,包括 Windows。希望你的答案是 3.7.x,甚至是更高版本;即使是 2.7.x,也先不要担心。许多系统都安装了两个版本的 Python。通常来说,输入python时会运行 Python 2,输入python3时运行 Python 3。


试一下:


python3 --versionPython 3.7.6
复制代码


如果得到类似输出,那么恭喜,你已经安装了 Python 3。


如何升级/安装

我发现这有个很棒的网站,它明确地告诉你如何在 Windows、Linux、macOS 甚至 Chromebooks 上安装 Python 3。去那里看看,收获会不小。


如何迁移你的代码?

现在,你已经运行 Python 3,就该升级代码了。代码升级并不难,你可以遵循多种策略。现在大多数的库都已经兼容 Pyhton 3。


所以你只需要:


  1. 升级自己的代码

  2. 如有必要,将依赖项升级到比较新的、兼容 Python 3 的版本


2to3

2to3是一个 Python 程序,可以读取 Python 2 源码并进行一系列修复,将其转换为有效的 Python 3 代码。其标准库包含一组丰富的修复程序,几乎可以处理所有代码。


Python 3 中的一个明显变化是print现在变成了名为print()的函数。例如,以下 Python 2 代码:


def greet(name):    print "Hello, {0}!".format(name)print "What's your name?"name = raw_input()greet(name)
复制代码


可以通过调用进行转换


$ 2to3 greet.py
复制代码


默认情况下,这只会将差异部分显示在屏幕上。不过在检查后,你可以用-w选项,它就会真的更改文件了:


$ 2to3 -w greet.py
复制代码


原始文件已被更改,而旧文件将被保存为greet.py.bak。结果如下:


def greet(name):     print("Hello, {0}!".format(name)) print("What's your name?") name = input() greet(name)
复制代码


2to3还有一些更有趣的选项:


  • -l —— 列出所有的修复程序

  • -x —— 排除选择的修复程序

  • -f —— 只运行指定的修复程序


在开始代码转换之前,请继续并阅读完整文档


six

six是一个 Python 2 和 3 的兼容库,它可以帮助代码库同时支持 Python 2 和 3。我建议使用2to3完全迁移到 Python 3,但如果你不能这么做(无论出于什么原因),至少它可以做到让你的代码库在两个版本上都能用。


six 提供的函数能消除 Python 2 和 3 之间的语法差异。一个简单的例子是six.print_(),在 Python 3 中打印是通过print()函数完成的,在 Python 2 中print没有括号。因此,通过使用six.print_(),你可以用一条语句同时支持两个语言版本。


实际上:


  • six的名字出自于 2 乘 3 等于 6

  • 还有一个类似的库是future


升级你的包

你可能需要升级依赖的包。对每个正在使用的包,检查它是否已经支持 Python 3。


如果没有,就去找支持的版本。你可能需要改动某些代码,因为 API 往往会随着时间改变。


检查最低要求的 Python 版本

迁移代码后,可以在代码中检查 Python 版本。这样可以确保你和用户没有在不兼容的版本下运行脚本,否则会导致难以理解的错误。像这样做一个简单的检查:


if not sys.version_info > (2, 7):    # 批评下还在用十年前版本python的用户elif not sys.version_info >= (3, 5):    # 告诉用户他(她)需要升级,因为你用到了3.5版本的特性
复制代码


Python 3 的优点

为进一步提起你的胃口,以下是 Python 3 具备的一些优点。


1.Print 不再是语句而是内置函数

好处在于:


  • 确实没有理由让print作为一个语句存在,如果print是一个函数会更加统一。

  • 因为print是一个函数,因此可以将其作为参数传递给需要它的函数。以一个函数为例,它需要另一个函数进一步处理数据作为参数。为简单地对它实现模拟/调试,你现在能直接传递一个print()函数。

  • 可以像这样用print[print(x) for x in range(10)],因为现在它是一个函数。

  • 可以通过指定builtins.print来覆写print函数,而对于语句就不能这么做了。


2.Unicode

在 Python 3 中,每个字符串默认都是 Unicode 字符串。在 Python 2 中,字符串默认为 ASCII 字符串,这限制了它可以处理的字符范围。如果需要 Unicode 字符串,则必须这样创建:


# Python 3中不再需要unicode_sting = u'Ümlaut? Nō prōblem!'
复制代码


这在许多国家是必需的。


3.数据类

从 3.7 版本(相当新版本)开始,Python 提供数据类(data classes)。与常规类或其他替代方法相比,它有一些优点,例如返回多个值或字典:


  • 数据类(data classes)需要的代码量最少

  • 实现了__eq__,所以可以对比数据类(data classes)

  • 实现了__repr__,可以轻松打印出一个数据类

  • 数据类需要类型提示,能减少错误的发生


以下是实践中数据类(data classes)的示例:


from dataclasses import dataclass
@dataclassclass Card: rank: str suit: str card = Card("Q", "hearts")
print(card == card)# True
print(card.rank)# 'Q'
print(card)Card(rank='Q', suit='hearts')
复制代码


4.合并字典

从 Python 3.5 起,合并字典变得更容易:


dict1 = { 'a': 1, 'b': 2 }dict2 = { 'b': 3, 'c': 4 }merged = { **dict1, **dict2 }print (merged)# {'a': 1, 'b': 3, 'c': 4}
复制代码


如果存在重叠的键,则第一个字典中的键将被覆盖。


5.除法变得更加可预见

在 Python 2 中,除法运算符(/)默认为整数除法,除非操作数之一是浮点数。 因此有以下行为:


# Python 25 / 2 = 25 / 2.0 = 2.5
复制代码


在 Python 3 中,除法运算符默认为浮点除法,//运算符变为整数除法。 这样我们会得到:


Python 35 / 2 = 2.55 // 2 = 2
复制代码


关于这项更改背后的动机,你可以读一读PEP-0328


6.有意义的比较

在 Python 2 中,可以对所有内容进行比较。 以下示例将全部返回 True:


print "a string" > 2print None < 5
复制代码


它没有意义,并且可能将错误隐藏。在 Python 3 中,这些比较将引发TypeError异常。


7.不再有 range vs. xrange

Python 2 有两个range函数:rangexrange,后者更快,因为它的实现基于迭代器。


在 Python 3 中,range已变为xrange,并且删除了xrange名称。在这个地方,Python 减少了学习者的困惑。


小结

对于 Python 3 vs. Python 2 的话题,我可以一直谈下去,但现在你应该知道该做什么。


2020 年 4 月后,放弃对 Python 2 支持的简单事实应该足以让你采取行动,转换那些代码库。


英文原文:


Why You Must Migrate to Python 3 Now


2020 年 3 月 17 日 07:302097

评论

发布
暂无评论
发现更多内容

天啊!怎么会有人把Spring Cloud微服务架构讲得这么透彻?

Java架构之路

Java 程序员 架构 面试 编程语言

某美团程序员爆料:筛选简历时,用go语言的基本不看!网友:当韭菜还当出优越感了!

Java架构师迁哥

《迅雷链精品课》第五课:账户与账本

迅雷链

区块链

区块链数字货币钱包源码价格,区块链多币种钱包

13530558032

基于SpringBoot、SpringCloud、Docker微服务架构实战,资源分享

Java架构之路

Java 程序员 架构 面试 编程语言

架构师Week5总结

lggl

总结

苹果首发ARM架构电脑芯片,将对PC格局带来哪些影响?

脑极体

KubeVela 正式开源:一个高可扩展的云原生应用平台与核心引擎

阿里巴巴云原生

阿里云 开源 Kubernetes 云原生 OAM

面试题总结--HashMap、Volatile相关

彭阿三

分布式事务太繁琐?官方推荐Atomikos,5分钟帮你搞定

互联网应用架构

分布式事务 springboot

大四女学霸社招竟成功签约字节跳动,拿下30万年薪?

Java架构师迁哥

架构师Week5作业

lggl

作业

《Python程序员面试算法宝典》PDF 超清版免费领取

计算机与AI

Python 面试 算法

力扣(Leetcode)练习--给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序

Wynne

亚马逊全球百万钜惠引爆“黑五” 跨境狂欢“巅峰6日”震撼登场

爱极客侠

粉丝求助:JAVA程序员,4年了,很迷茫,希望前辈可以给指出一个技术路线和需掌握的知识技能树;

Java架构师迁哥

太赞了!腾讯T3-3架构师整理了5000页的Java学习手册免费开放下载

Java架构之路

Java 程序员 架构 面试 编程语言

开个交易所需要多少费用?数字货币交易所搭建

13530558032

云算力矿机源码价格,区块链挖矿平台开发

13530558032

【云图说】第189期 初识数据仓库服务

华为云开发者社区

数据库 数据仓库 数据

LAXCUS大数据集群操作系统挖矿

陈泽云

大数据 分布式计算 挖矿

SQL数据库:GROUPING运算符

正向成长

GROUPING运算符

收藏!数据建模最全知识体系解读

华为云开发者社区

数据仓库 数据 数据建模

JVM入门,认识Class文件

Simon郎

JVM Java 分布式

涛涌天际,水利万物:黄浦江畔读懂城市智能体

脑极体

京东开发4年,想要跳槽去拼多多,落泪四4面,这年头跳槽可真难啊(还好不是裸辞)

Java~~~

架构 面试 编程语言 Java 面试 java架构师

胡继晔:中国应建区块链行业准入制度

CECBC区块链专委会

区块链 金融 数字经济

Forrester 最新报告:阿里云稳居领导者地位,引领云原生开发浪潮

阿里巴巴云原生

阿里云 Serverless Kubernetes 容器 云原生

阿里作为内部参考的Redis文档现在开放下载,姐夫半夜不睡都在看

小Q

Java redis 学习 编程 面试

如何在 vuePress中添加博客导流公众号-即输入验证码解锁全站文章

itclanCoder

vuepress 解锁文章 博客引流 建站

甲方日常 54

句子

工作 随笔杂谈 日常

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

技术为帆,纵横四海- Lazada技术东南亚探索和成长之旅

为什么你现在必须迁移到Python 3?-InfoQ