对于某些项目,我想停止支持Python 2.7(请参阅http://python3statement.org/),以仅使用Python> 3.6(或更确切地说是3.5 + f字符串,例如Pypy v6.0)。
第一步可能是修改setup.py文件,以得到一个明确的错误,如果一个人尝试将该软件包与不带f字符串的Python版本一起使用。
但是接下来有很多工作要切换到纯Python 3.6语法并删除所有
并在许多地方替换
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字符串,因为f字符串更干净(且速度稍快)。
我仍然认为我提到的修改是合理的。
答案 0 :(得分: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参数super
之类的简单事物。如果出于某种原因,如果您想用尽可能多的闪亮的新语言功能填充代码,则类似
enum
,pathlib
进行路径操作,subprocess.run
API,yield from
重构生成器,或者,这甚至还没有考虑您现在可以访问的仅Python 3依赖项。其中许多事情都需要仔细的设计工作才能纳入您的程序。以一种能产生好代码的方式来整合它们并不是自动工具,也不是无意识的,快速的手动传递代码所能处理的事情。试图告诉您如何将所有这些内容合并到您的程序中对于堆栈溢出的答案来说太过广泛了;有太多新东西了。
此外,即使Python标准库本身也不会清除与旧版本兼容的模式。快速浏览grep
到current CPython master branch会显示数百个仍从object
继承的类,以及str.format
的一千多种用法,可以用f字符串代替。
答案 1 :(得分: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/)。