102 lines
4.2 KiB
Markdown
102 lines
4.2 KiB
Markdown
|
|
# 如何迁移到 Python 3
|
|||
|
|
|
|||
|
|
> 原文:[https://python . land/migrating-from-python-2-to-3/how-to-migrate-to-python-3](https://python.land/migrating-from-python-2-to-3/how-to-migrate-to-python-3)
|
|||
|
|
|
|||
|
|
一旦安装了 Python 3 并开始工作,就该迁移到 Python 3 了。大多数情况下,升级代码并不难,可以遵循多种策略。
|
|||
|
|
|
|||
|
|
你需要做的是:
|
|||
|
|
|
|||
|
|
* 升级您自己的代码
|
|||
|
|
* 升级到依赖项的较新版本
|
|||
|
|
|
|||
|
|
幸运的是,有一些工具可以帮助我们!
|
|||
|
|
|
|||
|
|
目录
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
* [2to3](#2to3 "2to3")
|
|||
|
|
* [六个](#Six "Six")
|
|||
|
|
* [升级您的软件包](#Upgrade_your_packages "Upgrade your packages")
|
|||
|
|
* [检查最低要求的 Python 版本](#Check_for_a_minimum-required_Python_version "Check for a minimum-required Python version")
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
## 2to3
|
|||
|
|
|
|||
|
|
`2to3`是一个 Python 程序,它读取 Python 2 源代码,并应用一系列修复程序将其转换成有效的 Python 3 代码。标准库包含一组丰富的修复程序,可以处理几乎所有的代码。
|
|||
|
|
|
|||
|
|
Python 3 中一个显著的变化是`print`现在是一个叫做`print()`的[函数](https://python.land/introduction-to-python/functions)。例如,这段 Python 2 代码:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
def greet(name):
|
|||
|
|
print "Hello, {0}!".format(name)
|
|||
|
|
print "What's your name?"
|
|||
|
|
name = raw_input()
|
|||
|
|
greet(name)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
可以通过调用以下命令进行转换:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ 2to3 greet.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
默认情况下,这只会将差异打印到屏幕上以供检查。如果看起来没问题,您可以使用`-w`选项来实际更改文件:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
$ 2to3 -w greet.py
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
原始文件被更改,旧文件将保存为 greet.py.bak。结果:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
def greet(name):
|
|||
|
|
print("Hello, {0}!".format(name))
|
|||
|
|
print("What's your name?")
|
|||
|
|
name = input()
|
|||
|
|
greet(name)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`2to3`的一些更有趣的标志是:
|
|||
|
|
|
|||
|
|
| 旗 | 功能 |
|
|||
|
|
| --- | --- |
|
|||
|
|
| -我 | 列出所有修复程序 |
|
|||
|
|
| [加在以-u 结尾的法语词源的名词之后构成复数] | 排除选定的定影剂 |
|
|||
|
|
| -f | 仅显式运行此修复程序 |
|
|||
|
|
| -w | 更新文件而不是打印到标准输出 |
|
|||
|
|
|
|||
|
|
Thank you for reading my tutorials. I write these in my free time, and it requires a lot of time and effort. I use ads to keep writing these *free* articles, I hope you understand! **Support me by disabling your adblocker on my website** or, alternatively, **[buy me some coffee](https://www.buymeacoffee.com/pythonland)**. It's much appreciated and allows me to keep working on this site!
|
|||
|
|
|
|||
|
|
在开始转换代码之前,请继续阅读完整的 2to3 文档。
|
|||
|
|
|
|||
|
|
## 六个
|
|||
|
|
|
|||
|
|
`six`是一个 Python 2 和 3 兼容库。该项目帮助代码库同时支持 Python 2 和 3。我建议用`2to3`完全迁移到 Python 3,但是如果你不能,不管什么原因,你至少可以让你的代码库在两个版本上都工作。
|
|||
|
|
|
|||
|
|
Six 提供了消除 Python 2 和 3 之间语法差异的函数。一个容易理解的例子是`six.print_()`。在 Python 3 中,打印是通过`print()`函数完成的。在 Python 2 中,`print`不需要括号。通过使用`six.print_()`,您可以用一条语句支持两种语言。
|
|||
|
|
|
|||
|
|
几个好听的都知道:
|
|||
|
|
|
|||
|
|
* 六这个名字来源于这样一个事实:二乘以三等于六。
|
|||
|
|
* 对于类似的库,也可以查看`future`包。
|
|||
|
|
|
|||
|
|
## 升级您的软件包
|
|||
|
|
|
|||
|
|
您可能需要升级您所依赖的包。对于您正在使用的每个包版本,尝试找出它是否已经支持 Python 3。如果不支持,就找一个支持的版本。您可能需要修改一些代码,因为 API 往往会随着时间而变化。
|
|||
|
|
|
|||
|
|
如果你很着急,并且你的包的 API 有了很大的变化,你可以尝试找到支持 Python 3 的包的最低版本。API 在较低版本中可能没有太大的变化。使用最新版本几乎总是更好,但至少这是朝着正确方向迈出的一步!
|
|||
|
|
|
|||
|
|
## 检查最低要求的 Python 版本
|
|||
|
|
|
|||
|
|
一旦迁移到 Python 3,在代码中添加 Python 版本检查。这样,您可以确保您和您的用户不会使用不兼容的版本运行您的脚本,这将导致不可理解的错误和挫折。使用这样一个简单的检查:
|
|||
|
|
|
|||
|
|
```py
|
|||
|
|
if not sys.version_info > (2, 7):
|
|||
|
|
# berate your user for running a 10 year
|
|||
|
|
# python version
|
|||
|
|
elif not sys.version_info >= (3, 5):
|
|||
|
|
# Kindly tell your user (s)he needs to upgrade
|
|||
|
|
# because you're using 3.5 features
|
|||
|
|
```
|