1

对于某些项目,我想停止支持 Python 2.7(请参阅http://python3statement.org/)以仅使用 Python > 3.6(或者更确切地说是 3.5 + f-string,如 Pypy v6.0)。

如果尝试将包与没有 f-string 的 Python 版本一起使用,第一步可能是修改 setup.py 文件以获得显式错误。

但是要切换到纯 Python 3.6 语法并删除所有

  • from __future__ import ...,

  • try与 Python 2.7 支持相关,

  • 未来和/或

并在许多地方更换

  • class MyClass(object)->class MyClass:
  • super(MyClass, self)->super()
  • "{}".format(foo)->f"{foo}"

我基本上是手动为代码完成了这项工作(实际上我还通过使用 Python 脚本处理代码来自动化一些步骤),我真的看到了不同之处。代码现在不那么冗长了,全局也变得更好了。

我确信我忘记了许多其他可以做的很好的简化,例如我现在使用了很多from pathlib import Path,但这些更改不那么直接。

您如何将 Python 2.7/3.6 兼容代码转换为干净的 Python 3.6 代码?如何避免手动完成这项无聊的工作?

在第一个答案后编辑

我认为假设的内化(在许多情况下不会附加)不应该阻止我们使用 f-strings,它只是更干净(并且稍微快一点)。

我仍然认为我提到的修改是合理的。

4

2 回答 2

2

如果您的目标是阻止您的代码在 Python-3.6 之前的版本上运行,请明确检查:

import sys
if sys.version_info < (3, 6):
    raise RuntimeError('my_thing requires a Python version of at least 3.6.')

如果您不再关心 Python-3.6 之前的支持,那么您无需做任何事情。您的代码已经是完全有效的 Python 3.6。


尝试遍历整个代码库并将其全部转换为使用不适用于先前版本的技术只会导致大量不必要的代码流失,并有可能引入错误而没有真正的收益。新技术甚至不是对旧技术的无条件升级。例如,如果您将所有的字符串格式切换为 f 字符串,您可能会发现自己必须重新进行所有操作以支持国际化,因为不可能将 f 字符串格式国际化。

相反,当您有特定原因更改代码的某些部分时,您应该在进行这些更改时随意使用与 3.6 之前的 Python 版本不兼容的技术。


请记住,新 Python 版本中的新事物不仅仅是像 0-argument 这样的简单事物super。如果您出于某种原因想在代码中填充尽可能多的闪亮的新语言功能,则可以使用类似

那是在考虑您现在可以访问的纯 Python 3 依赖项之前。其中许多事情需要仔细的设计工作才能融入您的程序。以产生真正好的代码的方式合并它们不是自动工具或无意识的快速手动传递代码可以处理的事情。试图告诉您如何将所有这些东西合并到您的程序中对于 Stack Overflow 的答案来说太宽泛了;新东西太多了。

此外,即使是 Python 标准库本身也没有努力清除与旧版本兼容的模式的使用。快速grep浏览当前的 CPython 主分支会显示数百个类仍然继承自这些类,并且可以用 f-strings 替换这些类object的上千种用途。str.format

于 2018-09-20T22:13:17.700 回答
1

我找到了一个很棒的工具,可以满足我的需要:pyupgrade

有一个选项--py36-plus可以触发大多数替换"{}".format(var)f"{var}"更清洁和更清晰)。

使用 Unix 命令find -name "*.py" | xargs pyupgrade --py36-plus,它会产生这样的提交:

https://bitbucket.org/fluiddyn/fluidsim/pull-requests/78/pyupgrade-py36-plus

现在,代码更加简洁明了,并显示了我们今天想要的编码风格。

这对于放弃 Python 2.7 支持的项目非常有用(请参阅http://python3statement.org/)。

于 2019-02-12T07:53:23.610 回答