提前锁票 InfoQ 最具价值感的视频栏目 | InfoQ 大咖说 了解详情
写点什么

为什么你现在必须迁移到 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:302026

评论

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

腾讯人均月薪7.5w,我这是又被平均了?

程序员生活志

腾讯 职场 薪资

SpringBoot系列(五):SpringBoot 日志配置(logback)

xcbeyond

Java 微服务 springboot logback

敏捷软件工程实践书籍

Bob Jiang

敏捷 敏捷书籍 工程实践

推荐一个替代印象笔记,onenote的神奇笔记!

申屠鹏会

笔记

Rust竟然没有异常处理?

袁承兴

rust 异常 java异常处理

一瓶可乐的自动售货机指令“旅程”

华为云开发者社区

物联网 嵌入式 华为云 数据传输 无线通信

网站改版神秘公式,教你躲避改版陷阱

北柯

创业 网站 网站搭建 网站改版

AI能写浙江高考满分作文了!在线满分作文生成器,一键圆你满分梦

程序员生活志

AI

JavaScript中的正则表达式详解

华为云开发者社区

Java 正则表达式 程序员 字符串 语法

libuv 异步模型之设计概览

Huayra

libuv 异步模型

守护进程

书旅

php 进程 守护进程

PHP之闭包函数

书旅

面向对象 闭包 函数

领域驱动设计(DDD)实践之路(二):事件驱动与CQRS

vivo互联网技术

DDD 架构设计 CQRS

MySQL explain 中的 rows 究竟是如何计算的?

架构精进之路

MySQL

SpringBoot系列(六):SpringBoot 数据库操作(集成MyBatis)

xcbeyond

Java 微服务 mybatis springboot

免费DDoS攻击测试工具大合集

陈磊@Criss

二叉查找树-增删查和针对重复数据的 Java 实现

多选参数

数据结构 算法 二叉树 数据结构与算法

智“营”时代,众盟科技荣膺“2020毕马威中国领先消费科技TOP50企业榜单”

人称T客

MySQL备份脚本,应该这么写

Simon

MySQL

面试造火箭,看下这些大厂原题

前端有的玩

Java 前端 面试题

如何从红蓝墨水中分离出红墨水?回声消除算法介绍

拍乐云Pano

音视频 WebRTC 回声消除 3A算法 音频技术

面试官:说下对cookie,session,Token的理解

Java小咖秀

Java Java 面试

Phalcon注解学习

半亩房顶

php phalcon

年近而立,Java何去何从?

华为云开发者社区

Java 程序员 编程语言 开源代码 Bugayenko Yegor

troubleshoot之:分析OutOfMemoryError异常

程序那些事

Java JVM 异常 JIT

分苹果

书旅

算法 LeetCode

合约一键跟单软件开发技术,跟单系统搭建app

WX13823153201

比特币 区块链

实践总结:在 Java 中调用 Go 代码

jiacai2050

终于知道Kafka为什么这么快了!

海星

kafka 消息队列

应用研发平台特惠专场,助力企业加速数智化发展

应用研发平台EMAS

分布式链路追踪Skywalking 存储模型设计

胡弦(关注公众号架构治理之道)

分布式 Skywalking 高性能 分布链路追踪

打造 VUCA 时代的 10 倍速 IT 团队

打造 VUCA 时代的 10 倍速 IT 团队

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