抖音技术能力大揭密!钜惠大礼、深度体验,尽在火山引擎增长沙龙,就等你来! 立即报名>> 了解详情
写点什么

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

评论

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

已拿到蚂蚁金服Offer!阿里内部二十三万字Java面试题总结

Java架构追梦

Java 阿里巴巴 架构 面试题总结 金三银四

Redis新版本开始引入多线程,谈谈你的看法?

Java架构师迁哥

下一站,星辰大海!

百度大脑

百度 AI 上市

nsq源码阅读之nsqd总体流程

werben

golang nsq

Python-计算机视觉-OpenCV-调色板

Aldeo

Python OpenCV

Netty 核心源码解读 —— ServerBootstrap 篇

然行

Netty

一文搞懂 Flink 中的锁

shengjk1

flink flink 锁

超全Android中高级面试复习大纲,在线面试指南

欢喜学安卓

android 程序员 面试 移动开发

SDK介绍及相关功能测试

行者AI

测试 sdk

硬件工程师必备,常用元器件封装速查表

不脱发的程序猿

28天写作 电路设计 3月日更 元器件封装速查表 电子设计

阿里一战封神,百万人跪求的Java面试手册终于开源;

Java架构师迁哥

Swift 5创建和使用Framework, XCFramework 从入门到精通 John 易筋 ARTS 打卡 Week 42

John(易筋)

ARTS 打卡计划 Framework XCFramework

Python 高手都这样使用字典,这些高效方法你知道吗?|pythonic 小技巧

AlwaysBeta

Python

Flink 计算 TopN

shengjk1

flink flink 实战 flink topN

如何在3分钟内实现音频变声和趣味音效?

拍乐云Pano

音视频 RTC 出海社交 社交泛娱乐

使用Redis,你必须知道的21个注意要点

云流

Java 数据库 redis 架构 面试

nsq源码阅读之Topic

werben

golang nsq

快速使用Vue3最新的15个常用API(1W5+字详解,建议收藏)

零一

vue.js 前端 Vue3

4层板到12层板叠层经典设计方案

不脱发的程序猿

28天写作 电路设计 3月日更 PCB PCB布局

SQLServer性能调优方法小结

嘉为蓝鲸

数据库 sql 运维 SqlServer MAXDOP

DB-Engines 3月数据库排名:MySQL跳出“同期跌幅榜”,拿下“本月涨幅榜冠军”

华章IT

数据库

nsq源码阅读之Channel

werben

golang nsq

Flink 计算 PV UV

shengjk1

flink flink 实战

Dubbo的设计理念原来就藏在这三张图中

中间件兴趣圈

dubbo RPC

图解TCP的通信机制

零一

TCP 网络

到底什么是Event Loop?那就来了解一下JavaScript分别在浏览器和Node环境下的运行机制吧

零一

JavaScript 前端

nsq源码阅读之diskqueue

werben

golang nsq

Netty 核心源码解读 —— 开篇

然行

Netty

【LeetCode】扁平化嵌套列表迭代器Java题解

HQ数字卡

算法 LeetCode 3月日更

想学IT的必看!漫谈MySQL权限安全,分享一点面试小经验

欢喜学安卓

android 程序员 面试 移动开发

nsq源码阅读之消息接收和发送

werben

golang nsq

Study Go: From Zero to Hero

Study Go: From Zero to Hero

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