python项目2to3方案预研
目录
- 官方工具2to3
- 工具安装
- 参数解释
- 基本使用
- 工具缺陷
- future
- 工具安装
- 参数解释
- 基本使用
- 工具缺陷
- python-modernize
- 工具安装
- 参数解释
- 基本使用
- 工具缺陷
- pyupgrade
- 工具安装
- 参数解释
- 基本使用
- 工具缺陷
- 对比
官方工具2to3
2to3
是Python官方提供的用于将Python 2代码转换为Python 3代码的工具。它能够自动检测Python 2代码中的语法和库差异,并尝试进行相应的转换。
工具安装
2to3
是Python的一部分,因此在安装Python时它会自动安装,如果一些版本的python没有自带2to3
工具,可以使用pip命令安装:
pip install 2to3
要运行 2to3,你可以在命令行中输入:
2to3.exe --help
$ 2to3.exe --help
用法:2to3 [选项] 文件|目录...选项:-h, --help 显示此帮助信息并退出-d, --doctests_only 仅修复文档测试-f FIX, --fix=FIX 每个 FIX 指定一个转换;默认:全部-j PROCESSES, --processes=PROCESSES并行运行 2to3-x NOFIX, --nofix=NOFIX阻止运行某个转换-l, --list-fixes 列出可用的转换-p, --print-function 修改语法以使 print() 成为一个函数-e, --exec-function 修改语法以使 exec() 成为一个函数-v, --verbose 更详细的日志记录--no-diffs 不显示重构的差异-w, --write 写回修改后的文件-n, --nobackups 不为修改后的文件写备份-o OUTPUT_DIR, --output-dir=OUTPUT_DIR将输出文件放在此目录中,而不是覆盖输入文件。需要 -n。-W, --write-unchanged-files即使没有必要进行更改,也写入文件(与 --output-dir 一起使用很有用);隐含 -w。--add-suffix=ADD_SUFFIX在所有输出文件名后附加此字符串。如果非空,需要 -n。 例如:--add-suffix='3' 将生成
参数解释
-
-h, --help
:- 作用:显示帮助信息,列出2to3工具的选项和用法说明。
- 示例:
2to3 --help
-
-d, --doctests_only
:- 作用:仅修复文档测试。这个选项用于只对文档中的测试代码进行转换。
- 示例:
2to3 -d your_code.py
-
-f FIX, --fix=FIX
:- 作用:指定转换规则。可以通过这个选项来选择要应用的特定转换规则。默认情况下是应用所有的规则。
- 示例:
2to3 -f all your_code.py
-
-j PROCESSES, --processes=PROCESSES
:- 作用:并行运行2to3。可以指定要同时运行的进程数量,以加快转换的速度。
- 示例:
2to3 -j 4 your_code.py
-
-x NOFIX, --nofix=NOFIX
:- 作用:阻止运行某个转换。可以使用这个选项来阻止特定的转换规则被应用。
- 示例:
2to3 -x range your_code.py
-
-l, --list-fixes
:- 作用:列出可用的转换规则。这个选项会显示出所有可用的转换规则的列表。
- 示例:
2to3 -l
-
-p, --print-function
:- 作用:修改语法以使
print()
成为一个函数。在Python 3中,print
语句被替换为了print()
函数。 - 示例:
2to3 -p your_code.py
- 作用:修改语法以使
-
-e, --exec-function
:- 作用:修改语法以使
exec()
成为一个函数。在Python 3中,exec
语句被替换为了exec()
函数。 - 示例:
2to3 -e your_code.py
- 作用:修改语法以使
-
-v, --verbose
:- 作用:产生更详细的日志记录。会输出更多关于转换过程的详细信息。
- 示例:
2to3 -v your_code.py
-
--no-diffs
:- 作用:不显示重构的差异。在转换过程中,不会显示每个文件的改动差异。
- 示例:
2to3 --no-diffs your_code.py
-
-w, --write
:- 作用:写回修改后的文件。会直接在原文件上进行修改,覆盖原来的Python 2代码。
- 示例:
2to3 -w your_code.py
-
-n, --nobackups
:- 作用:不为修改后的文件写备份。在进行转换时,不会为原文件创建备份。
- 示例:
2to3 -n your_code.py
-
-o OUTPUT_DIR, --output-dir=OUTPUT_DIR
:- 作用:将输出文件放在指定目录中,而不是覆盖输入文件。需要搭配
-n
选项一起使用。 - 示例:
2to3 -o converted_code -n your_code.py
- 作用:将输出文件放在指定目录中,而不是覆盖输入文件。需要搭配
-
-W, --write-unchanged-files
:- 作用:即使没有必要进行更改,也写入文件。这在使用
--output-dir
选项时非常有用,会确保所有文件都被写入。 - 示例:
2to3 -W -o converted_code -n your_code.py
- 作用:即使没有必要进行更改,也写入文件。这在使用
-
--add-suffix=ADD_SUFFIX
:- 作用:在所有输出文件名后附加指定字符串。如果指定了非空的后缀,需要搭配
-n
选项一起使用。 - 示例:
2to3 --add-suffix='.bak' -n your_code.py
- 作用:在所有输出文件名后附加指定字符串。如果指定了非空的后缀,需要搭配
基本使用
-
只提示,不修改原脚本:
$ 2to3.exe -j 4 . RefactoringTool: Skipping optional fixer: buffer RefactoringTool: Skipping optional fixer: idioms RefactoringTool: Skipping optional fixer: set_literal RefactoringTool: Skipping optional fixer: ws_comma --- .\main.py (original) +++ .\main.py (refactored) @@ -1 +1 @@ -print "This is ingress of the project" +print("This is ingress of the project") --- .\apps\urls.py (original) +++ .\apps\urls.py (refactored) @@ -1 +1 @@ -print "this is the url file" +print("this is the url file") RefactoringTool: No files need to be modified.
-
直接修改原脚本,同时会对原脚本做备份 -w:
$ 2to3.exe -w . RefactoringTool: Skipping optional fixer: buffer RefactoringTool: Skipping optional fixer: idioms RefactoringTool: Skipping optional fixer: set_literal RefactoringTool: Skipping optional fixer: ws_comma RefactoringTool: Refactored .\main.py RefactoringTool: Refactored .\apps\urls.py RefactoringTool: Files that were modified: RefactoringTool: .\main.py RefactoringTool: .\apps\urls.py --- .\main.py (original) +++ .\main.py (refactored) @@ -1 +1 @@ -print "This is ingress of the project" +print("This is ingress of the project") --- .\apps\urls.py (original) +++ .\apps\urls.py (refactored) @@ -1 +1 @@ -print "this is the url file" +print("this is the url file")
一般情况下,对于大项目应该并发的去转换,并且应用所有过滤规则,然后将原文件备份以供参考:
2to3.exe -j 4 -f all -w .
工具缺陷
2to3 工具是一个非常有用的工具,但也有一些缺陷和注意事项:
-
不能处理所有情况:
- 2to3 虽然可以处理许多常见的转换,但它并不能解决所有的情况。特别是对于一些复杂的代码结构或者使用了一些特殊库的情况,可能需要手动进行调整。
-
可能会引入错误:
- 由于自动转换过程可能涉及到复杂的代码结构和逻辑,有时候可能会出现转换后引入的错误或者逻辑不符合预期。
-
需要人工审查:
- 无论何时使用自动转换工具,都建议在转换后对代码进行人工审查以确保其正确性。
-
不一定能保留所有的原始注释和格式:
- 在转换过程中,原始的注释和代码格式可能会发生变化,特别是对于一些复杂的代码结构。需要在转换后进行检查和调整。
-
对第三方库的支持有限:
- 2to3 主要针对标准库进行转换,对于一些第三方库可能支持不完善或者需要额外的配置。
-
可能会产生大量的转换结果:
- 在对大型代码库进行转换时,可能会产生大量的转换结果,需要耗费一定的时间和精力进行检查和调整。
-
可能会导致性能下降:
- 一些复杂的转换可能会导致转换后的代码性能下降,需要进行优化。
-
不适用于所有项目:
- 对于一些旧的、特殊的项目,可能并不适合直接使用2to3工具进行转换,可能需要考虑其他迁移策略。
总的来说,2to3是一个很有用的工具,可以帮助自动化大部分的Python 2到Python 3的迁移工作,但需要谨慎使用,同时在转换后进行仔细的代码审查以确保正确性。在处理复杂或特殊情况时,可能需要结合手动调整和其他工具来完成迁移工作。
future
工具安装
future
是一个用于帮助在 Python 2 代码中使用 Python 3 的特性的库。它提供了一组可以让 Python 2 代码更容易向 Python 3 迁移的工具。
可以使用pip命令安装该工具:
pip install future
以下是 future
库的一些主要特点和功能:
-
兼容性:
future
库可以让你在 Python 2 中使用一些 Python 3 的特性,从而逐步实现向 Python 3 的平滑过渡。
-
提供兼容模块:
future
提供了一系列的模块,例如__future__
、builtins
等,可以让你在 Python 2 中使用 Python 3 的一些内置函数、语法等。
-
简化代码:
- 通过使用
future
提供的模块,你可以更容易地编写符合 Python 3 标准的代码,而不必担心在 Python 2 中的兼容性问题。
- 通过使用
-
提供一些辅助函数和工具:
future
还提供了一些辅助函数,用于处理一些常见的迁移问题,例如处理文本编码等。
-
支持通过命令行工具进行代码转换:
-
futurize
是future
库提供的一个命令行工具,可以帮助你批量地将 Python 2 代码转换为兼容 Python 3 的代码。 -
例如,可以通过以下命令将一个目录下的 Python 2 代码转换为 Python 3:
futurize -f all your_code.py
-
-
提供配置选项:
- 你可以通过配置文件或命令行选项来定制转换过程,例如选择要应用的 fixers 或指定转换后的输出目录。
总的来说,future
是一个非常实用的库,可以帮助你在 Python 2 中逐步采用 Python 3 的特性,从而为将来迁移到 Python 3 打下基础。但需要注意,虽然它可以简化许多工作,但并不是所有的代码都可以通过 future
完全自动转换,可能还需要手动进行一些调整。
参数解释
$ futurize --help
Usage: futurize [options] file|dir ...Options:-h, --help show this help message and exit-V, --version Report the version number of futurize-a, --all-imports Add all __future__ and future imports to each module-1, --stage1 Modernize Python 2 code only; no compatibility withPython 3 (or dependency on ``future``)-2, --stage2 Take modernized (stage1) code and add a dependency on``future`` to provide Py3 compatibility.-0, --both-stages Apply both stages 1 and 2-u, --unicode-literalsAdd ``from __future__ import unicode_literals`` toimplicitly convert all unadorned string literals ''into unicode strings-f FIX, --fix=FIX Each FIX specifies a transformation; default: all.Either use '-f division -f metaclass' etc. or use thefully-qualified module name: '-flib2to3.fixes.fix_types -flibfuturize.fixes.fix_unicode_keep_u'-j PROCESSES, --processes=PROCESSESRun 2to3 concurrently-x NOFIX, --nofix=NOFIXPrevent a fixer from being run.-l, --list-fixes List available transformations-p, --print-function Modify the grammar so that print() is a function-v, --verbose More verbose logging--no-diffs Don't show diffs of the refactoring-w, --write Write back modified files-n, --nobackups Don't write backups for modified files.-o OUTPUT_DIR, --output-dir=OUTPUT_DIRPut output files in this directory instead ofoverwriting the input files. Requires -n. For Python>= 2.7 only.-W, --write-unchanged-filesAlso write files even if no changes were required(useful with --output-dir); implies -w.--add-suffix=ADD_SUFFIXAppend this string to all output filenames. Requires-n if non-empty. For Python >= 2.7 only.ex: --add-suffix='3' will generate .py3 files.
汉化:
$ futurize --help
用法: futurize [选项] 文件|目录 ...选项:-h, --help 显示此帮助信息并退出-V, --version 报告 futurize 的版本号-a, --all-imports 向每个模块添加所有的 __future__ 和 future 导入-1, --stage1 仅现代化 Python 2 代码;不与 Python 3 兼容(或依赖于“future”)-2, --stage2 获取现代化(stage1)代码并添加对“future”的依赖以提供 Py3 兼容性。-0, --both-stages 应用阶段1和阶段2-u, --unicode-literals添加“from __future__ import unicode_literals”以隐式将所有未装饰的字符串文字 '' 转换为 Unicode 字符串-f FIX, --fix=FIX 每个 FIX 指定一个转换;默认:全部。要么使用 '-f division -f metaclass' 等,或者使用完全限定的模块名:'-flib2to3.fixes.fix_types -flibfuturize.fixes.fix_unicode_keep_u'-j PROCESSES, --processes=PROCESSES并行运行 2to3-x NOFIX, --nofix=NOFIX阻止运行某个转换。-l, --list-fixes 列出可用的转换-p, --print-function 修改语法以使 print() 成为一个函数-v, --verbose 更详细的日志记录--no-diffs 不显示重构的差异-w, --write 写回修改后的文件-n, --nobackups 不为修改后的文件写备份。-o OUTPUT_DIR, --output-dir=OUTPUT_DIR将输出文件放在此目录中,而不是覆盖输入文件。需要 -n。仅适用于 Python >= 2.7。-W, --write-unchanged-files即使没有必要进行更改,也写入文件(与 --output-dir 一起使用很有用);隐含 -w。--add-suffix=ADD_SUFFIX在所有输出文件名后附加此字符串。如果非空,需要 -n。仅适用于 Python >= 2.7。例如:--add-suffix='3' 将生成 .py3 文件。
基本使用
futurize的代码转换方法有第1阶段和第2阶段。
stage1:
-
在不影响Python2系统环境的范围内执行代码转换。因此,stage1中转换后的代码可能无法在Python3环境中工作。 stage1的目的是在与Python2兼容的范围内执行代码转换,这是完全更改Python3系列代码的第一步。通过将stage1夹在中间,可以降低一次转换代码的风险。
-
在stage1中,使用__future__模块,以便甚至可以在2系列环境中实现Python 3系列中与2系列不兼容的功能。不要添加将来的模块。
stage2:
- 在stage2中,为Python3系列完全重写了代码。
基本使用:
-
预览stage1中更改的部分(不写入)。
$ futurize.exe --stage1 . RefactoringTool: Skipping optional fixer: idioms RefactoringTool: Skipping optional fixer: ws_comma RefactoringTool: Refactored .\main.py RefactoringTool: Refactored .\apps\urls.py RefactoringTool: Files that need to be modified: RefactoringTool: .\main.py RefactoringTool: .\apps\urls.py --- .\main.py (original) +++ .\main.py (refactored) @@ -1 +1,2 @@ -print "This is ingress of the project" +from __future__ import print_function +print("This is ingress of the project") --- .\apps\urls.py (original) +++ .\apps\urls.py (refactored) @@ -1 +1,2 @@ -print "this is the url file" +from __future__ import print_function +print("this is the url file")
-
重写代码,并生成备份文件
futurize.exe -0 -w -f all .
工具缺陷
- 提供了兼容python2和python3的中间文件,但似乎无法直接转换到python3.
- 主要提供了对标准库的支持。
python-modernize
工具安装
python-modernize
是一个用于将 Python 2 代码现代化以兼容 Python 3 的工具。它提供了一组自动化工具,可以帮助将 Python 2 代码转换成符合 Python 3 标准的形式。
可以使用pip命令安装:
pip install modernize
以下是 python-modernize
的一些主要特点和功能:
-
自动转换:
python-modernize
提供了一系列的 fixers(转换器),可以自动将 Python 2 代码转换为兼容 Python 3 的形式。
-
向后兼容:
- 转换后的代码可以在 Python 2 和 Python 3 上运行,从而保持向后兼容性。
-
提供多个 fixers:
python-modernize
包含许多 fixers,可以用于解决各种不同的转换问题,例如将print
语句转换为print()
函数、将除法行为从整数转换为浮点数等。
-
支持多个转换阶段:
- 你可以选择性地运行不同阶段的转换,从而灵活地控制代码转换的深度。
-
提供详细的帮助文档:
python-modernize
提供了丰富的文档,可以帮助你了解如何正确地使用工具。
-
支持通过命令行工具进行代码转换:
-
你可以使用命令行工具来批量转换 Python 2 代码为兼容 Python 3 的形式。
-
例如,可以通过以下命令将一个目录下的 Python 2 代码转换为 Python 3:
modernize -f future your_code.py
-
-
可定制性:
- 你可以根据自己的需求选择性地应用 fixers,也可以配置工具的行为。
-
提供备份功能:
python-modernize
可以为转换后的代码创建备份,以便在需要时进行恢复。
参数解释
$ modernize.exe --help
Python _ __ __ ___ __| |___ _ _ _ _ (_)______| ' \/ _ \/ _` / -_) '_| ' \| |_ / -_)|_|_|_\___/\__,_\___|_| |_||_|_/__\___| 0.8.0Usage: modernize [options] file|dir ...Options:--version show program's version number and exit-h, --help show this help message and exit-v, --verbose Show more verbose logging.--no-diffs Don't show diffs of the refactoring.-l, --list-fixes List standard transformations.-d, --doctests_only Fix up doctests only.-f FIX, --fix=FIX Each FIX specifies a transformation; '-f default'includes default fixers.--fixers-here Add current working directory to python path (sofixers can be found)-j PROCESSES, --processes=PROCESSESRun fissix concurrently.-x NOFIX, --nofix=NOFIXPrevent a fixer from being run.-p, --print-function Modify the grammar so that print() is a function.-w, --write Write back modified files.-n, --nobackups Don't write backups for modified files.--six-unicode Wrap unicode literals in six.u().--future-unicode Use 'from __future__ import unicode_literals'(onlyuseful for Python 2.6+).--no-six Exclude fixes that depend on the six package.--enforce Returns non-zero exit code if any fixers had to beapplied. Useful for enforcing Python 3 compatibility.
汉化:
$ modernize.exe --help
Python _ __ __ ___ __| |___ _ _ _ _ (_)______| ' \/ _ \/ _` / -_) '_| ' \| |_ / -_)|_|_|_\___/\__,_\___|_| |_||_|_/__\___| 0.8.0用法: modernize [选项] 文件|目录 ...选项:--version 显示程序版本号并退出-h, --help 显示此帮助信息并退出-v, --verbose 显示更详细的日志记录。--no-diffs 不显示重构的差异。-l, --list-fixes 列出标准的转换。-d, --doctests_only 仅修复文档测试。-f FIX, --fix=FIX 每个 FIX 指定一个转换;'-f default' 包括默认的转换器。--fixers-here 将当前工作目录添加到 Python 路径中(以便找到转换器)。-j PROCESSES, --processes=PROCESSES并行运行 fissix。-x NOFIX, --nofix=NOFIX阻止运行某个转换。-p, --print-function 修改语法以使 print() 成为一个函数。-w, --write 写回修改后的文件。-n, --nobackups 不为修改后的文件写备份。--six-unicode 将 Unicode 文字字面值包装在 six.u() 中。--future-unicode 使用 'from __future__ import unicode_literals'(仅适用于 Python 2.6+)。--no-six 排除依赖于 six 包的转换。--enforce 如果需要应用任何转换,则返回非零退出代码。用于强制执行 Python 3 兼容性。
基本使用
当你使用 modernize.exe
工具时,你可以按照以下示例来执行相应的转换操作。
- 显示版本号:
modernize.exe --version
- 显示帮助信息:
modernize.exe --help
- 列出可用的转换规则:
modernize.exe -l
- 仅修复文档测试:
modernize.exe -d your_code.py
- 应用所有默认的转换规则:
modernize.exe -f default your_code.py
- 并行运行转换(例如,使用4个进程同时转换):
modernize.exe -j 4 your_code.py
- 阻止某个转换规则的运行(例如,阻止运行
division
转换):
modernize.exe -x division your_code.py
- 修改语法以使
print()
成为一个函数:
modernize.exe -p your_code.py
- 写回修改后的文件:
modernize.exe -w your_code.py
- 不为修改后的文件写备份:
modernize.exe -n your_code.py
- 将Unicode文字字面值包装在
six.u()
中:
modernize.exe --six-unicode your_code.py
- 使用
from __future__ import unicode_literals
(仅适用于 Python 2.6+):
modernize.exe --future-unicode your_code.py
- 排除依赖于
six
包的转换:
modernize.exe --no-six your_code.py
- 如果需要应用任何转换,则返回非零退出代码:
modernize.exe --enforce your_code.py
工具缺陷
略
pyupgrade
A tool (and pre-commit hook) to automatically upgrade syntax for newer versions of the language.
工具安装
pip install pyupgrade
参数解释
$ pyupgrade.exe --help
usage: pyupgrade [-h] [--exit-zero-even-if-changed] [--keep-percent-format][--keep-mock] [--keep-runtime-typing] [--py3-plus][--py36-plus] [--py37-plus] [--py38-plus] [--py39-plus][--py310-plus] [--py311-plus][filenames ...]positional arguments:filenamesoptions:-h, --help show this help message and exit--exit-zero-even-if-changed--keep-percent-format--keep-mock--keep-runtime-typing--py3-plus, --py3-only--py36-plus--py37-plus--py38-plus--py39-plus--py310-plus--py311-plus
汉…化:
$ pyupgrade.exe --help
用法: pyupgrade [-h] [--exit-zero-even-if-changed] [--keep-percent-format][--keep-mock] [--keep-runtime-typing] [--py3-plus][--py36-plus] [--py37-plus] [--py38-plus] [--py39-plus][--py310-plus] [--py311-plus][文件名 ...]位置参数:文件名选项:-h, --help 显示此帮助信息并退出--exit-zero-even-if-changed--keep-percent-format--keep-mock--keep-runtime-typing--py3-plus, --py3-only--py36-plus--py37-plus--py38-plus--py39-plus--py310-plus--py311-plus
基本使用
-
转换单个文件:
使用以下命令可以将单个 Python 文件转换为 Python 3 兼容形式:
pyupgrade your_code.py
这会将
your_code.py
中的 Python 2 代码转换为 Python 3 兼容的形式。 -
转换整个目录:
如果你想批量转换一个目录下的所有 Python 文件,可以使用类似以下的命令:
pyupgrade your_directory/
这将会逐个转换目录中的所有 Python 文件。
-
保留百分号格式化字符串:
如果你想保留百分号格式化字符串(如
%s
)而不转换为 f-strings,可以使用--keep-percent-format
选项:pyupgrade --keep-percent-format your_code.py
-
保留 mock 模块:
如果你使用了
mock
模块,可以使用--keep-mock
选项来保留该模块:pyupgrade --keep-mock your_code.py
-
保留运行时类型提示:
如果你想保留运行时类型提示(如
# type: ignore
),可以使用--keep-runtime-typing
选项:pyupgrade --keep-runtime-typing your_code.py
-
仅转换到 Python 3:
默认情况下,
pyupgrade
将代码转换为适用于所有 Python 3 版本的形式。如果你想只将代码转换为 Python 3,可以使用--py3-only
选项:pyupgrade --py3-only your_code.py
-
只转换到特定 Python 3 版本:
你可以使用相应的选项(如
--py36-plus
、--py37-plus
等)来将代码转换为特定版本的 Python 3 兼容形式。例如,要将代码转换为 Python 3.6 兼容形式,可以使用:
pyupgrade --py36-plus your_code.py
同样的方式适用于其他版本,如 Python 3.7、Python 3.8 等。
-
设置退出代码:
默认情况下,如果发生了转换,
pyupgrade
将返回非零退出代码。你可以使用--exit-zero-even-if-changed
选项来始终返回零退出代码。pyupgrade --exit-zero-even-if-changed your_code.py
将python2转为python3.11:
print "This is ingress of the project"class C(Base):def f(self):super(C, self).f()import functools@functools.lru_cache()
def expensive():pass
执行pyupgrade --py3-plus .\main.py
令我疑惑的是,并没有任何事情发生!!
工具缺陷
- 文档稀缺;
- 似乎不会执行;
对比
选择哪个工具来进行从 Python 2 到 Python 3 的迁移取决于你的项目特定需求以及你个人的偏好。以下是一些常用的迁移工具的特点和适用场景:
-
2to3:
- 官方工具:2to3 是 Python 官方提供的迁移工具,专门设计用于将 Python 2 代码转换为 Python 3 兼容的形式。
- 自动化程度高:2to3 可以自动识别和转换许多常见的 Python 2 到 Python 3 的语法和库的使用差异。
- 广泛使用:由于是官方工具,2to3 在许多项目中得到了广泛的应用。
-
futurize:
- 向前兼容性:futurize 旨在提供向后兼容性,使得代码可以同时在 Python 2 和 Python 3 中运行。
- 两阶段转换:可以选择将代码先转换成 Python 2/3 兼容形式(阶段 1),然后再添加
future
依赖以实现完全的 Python 3 兼容(阶段 2)。 - 灵活性:可以根据需要选择不同的转换规则。
-
modernize:
- 专注于 Python 2 到 Python 3:modernize 专注于将 Python 2 代码转换为 Python 3 兼容形式。
- 通过 2to3 进行转换:实际上,modernize 是基于 2to3 构建的,但提供了一些额外的功能和选项。
-
pyupgrade:
- 简单易用:pyupgrade 是一个简单、快速的工具,用于将 Python 2 代码转换为 Python 3 兼容的形式。
- 自动化程度较高:pyupgrade 试图通过自动化转换来尽可能减少需要手动检查的代码。
相关文章:
python项目2to3方案预研
目录 官方工具2to3工具安装参数解释基本使用工具缺陷 future工具安装参数解释基本使用工具缺陷 python-modernize工具安装参数解释基本使用工具缺陷 pyupgrade工具安装参数解释基本使用工具缺陷 对比 官方工具2to3 2to3 是Python官方提供的用于将Python 2代码转换为Python 3代…...
MongoDB 是什么和使用场景概述(技术选型)
一、从NOSQL(Not Only SQL)说起 常见的数据库可以分为下面的两种类型: RDBMS(关系型数据库):常见的关系型数据库有 Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL;NoSQL(非关系型数据库&a…...
打印 pyspark.sql.dataframe.DataFrame 有哪些列
在 PySpark 中,要打印 pyspark.sql.dataframe.DataFrame 的列,可以使用 columns 属性。以下是一个示例代码: from pyspark.sql import SparkSession# 创建 SparkSession spark SparkSession.builder.getOrCreate()# 假设您的 DataFrame 名称…...
什么是虚拟DOM(Virtual DOM)?它在前端框架中的作用是什么?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是虚拟DOM(Virtual DOM)?⭐ 虚拟DOM 在前端框架中的作用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦&…...
QT实现简易时钟
头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPaintEvent> #include <QDebug> #include <QPainter> #include <QTimerEvent> #include <QTimer> #include <QTime>QT_BEGIN_NAMESPACE namespace Ui { cl…...
win禁用更新,取消windows更新提示,禁用windows自动更新
取消windows自动更新 前言:跟着我的节奏一步一步点下去,就OK 第一步第二步第三步第四步第五步第六步第七步 新建文件第八步 新增文件名称:FlightSettingsMaxPauseDays第九步 设置暂停更新天数第十步 选中你设置的最大值 前言:跟着…...
倒计时列表实现(小程序端Vue)
//rich-text主要用来将展示html格式的,可以直接使用这个标签 <view class"ptBox" v-for"(item,index) in orderList" :key"index"> <rich-text :nodes"item.limit_time|limitTimeFilter"></rich-text>…...
ContentType:application/x-www-form-urlencoded请求方法遇到的坑【PHP】
有些API要求请求的内容类型为application/x-www-form-urlencoded function requestUrl($url,$datanull,$httpstrue,$methodpost){//1.初始化url$ch curl_init($url);//2.设置相关的参数//字符串不直接输出,进行一个变量的存储curl_setopt($ch, CURLOPT_RETURNTRANSFER, true)…...
RabbitMQ - 死信、TTL原理、延迟队列安装和配置
目录 一、死信交换机 1.1、什么是死信交换机 1.2、TTL 1.2.1、什么是 TTL 1.2.2、通过 TTL 模拟触发死信 二、延迟队列 2.1、什么是延迟队列 2.2、配置延迟队列插件 2.2.1、延迟队列配置 a)下载镜像 b)运行容器 c)刚刚设定的Rabb…...
大数据与云计算实验一
检查是否开启 sudo service docker status 开启服务 sudo service docker start 运行服务 sudo docker run -itd -p 8080:80 nginx 查询ID docker ps -all 进入容器shell sudo docker exec -it <容器ID或容器名称> /bin/bash 找到/usr/share/nginx/html/index.…...
实施主品牌进化战略(一):确立主品牌进化架构
主品牌进化战略,即以主品牌为核心创造、巩固、转化竞争优势应对竞争环境变化,避免衰退,回归增长,让主品牌进化的方法论体系。主品牌进化战略制定要从 4 个方面出发:确立主品牌进化架构、更新和明确主品牌竞争方向、建立…...
linux搭建单机ES,集成ik分词器,文本抽取,Kibana可视化平台
Elasticsearch单机(Linux) 准备工作 第一项: 创建运行Elasticsearch和Kibana专用的普通用户,因为 elasticsearch 和 kibana 不允许使用 root用户启动,所以需要创建新用户启动。 linux用root权限创建一个用户赋权即可…...
金融和大模型的“两层皮”问题
几年前,我采访一位产业专家,他提到了一个高科技到产业落地的主要困惑:两层皮。 一些特别牛的技术成果在论文上发表了,这是一层皮。企业的技术人员,将这些成果产品化、商品化的时候,可能出于工程化的原因&am…...
智能生活从这里开始:数字孪生驱动的社区
数字孪生技术,这个近年来备受瞩目的名词,正迅速渗透到社区发展领域,改变着我们居住的方式、管理的方式以及与周围环境互动的方式。它不仅仅是一种概念,更是一种变革,下面我们将探讨数字孪生技术如何推动社区智能化发展…...
Python计算机二级知识点整理
1.当一个进程在运行过程中释放了系统资源后要调用 唤醒进程原语 唤醒进程原语是把进程从等待队列里移出到就绪队列并设置进程为就绪状态,当一个进程在运行过程中释放了系统资源后进入就绪状态,调用唤醒进程原语。 2. 3. 4.在希尔排序法中&#x…...
双系统ubuntu20.04(neotic版本)从0实现Gazebo仿真slam建图
双系统ubuntu20.04(neotic版本)从0实现Gazebo仿真slam建图 昨晚完成了ROS的多机通讯,还没来得及整理相关操作步骤,在进行实际小车的实验之前,还是先打算在仿真环境中进行测试,熟悉相关的操作步骤,计划通过虚拟机&…...
(JavaEE)(多线程案例)线程池 (简单介绍了工厂模式)(含经典面试题ThreadPoolExector构造方法)
线程诞生的意义,是因为进程的创建/销毁,太重了(比较慢),虽然和进程比,线程更快了,但是如果进一步提高线程创建销毁的频率,线程的开销就不能忽视了。 这时候我们就要找一些其他的办法…...
单播与多播mac地址
MAC 地址(Media Access Control Address)是一个用于识别网络设备的唯一标识符。每个网络设备都有一个独特的 MAC 地址,用于在局域网中进行通信。 单播MAC地址:单播MAC地址用于单播通信,即一对一的通信模式。当设备发送…...
反向动力学Ik学习
参考文章:(非本人原创) 英文原文:Inverse Kinematics Techniques in Computer Graphics: A Survey (andreasaristidou.com) 知乎翻译文章: 【游戏开发】逆向运动学(IK)详解 - 知乎 (zhihu.co…...
基于Levenberg-Marquardt算法的声源定位matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................................................... %ML if (bML1)varxs…...
vscode的Emmet语法失效
解决方案:设置 -> 搜索Emmet -> 勾选 Emmet:Trigger Expansion On Tab和Emmet: Use Inline Completions -> 重启 注:Emmet语法是vscode自带的语法,可以快速生成HTML结构/CSS样式/格式化语法 Emmet语法 参考:关于vscode使…...
堆排序(大根堆)
堆的定义如下,n个关键字序列[1...n]称为堆,当且仅当满足: a(i)>a(2i)且a(i)>a(2i1) 这个为大根堆 a(i)<a(2i)且a(i)<a(2i 1) 这个为小根堆 通过建堆得到大根堆 大根堆 87,45,78,32,17,65,53,9 可以看成 …...
Mybatis学习笔记3 在Web中应用Mybatis
Mybatis学习笔记2 增删改查及核心配置文件详解_biubiubiu0706的博客-CSDN博客 技术栈:HTMLServletMybatis 学习目标: 掌握mybatis在web应用中如何使用 Mybatis三大对对象的作用域和生命周期 关于Mybatis中三大对象的作用域和生命周期、 官网说明 ThreadLocal原理及使用 巩…...
软件测试之功能测试详解
一、功能测试概述 1)功能测试就是对产品的各功能进行验证,根据功能测试用例,逐项测试,检查产品是否达到用户要求的功能。 2)功能测试,根据产品特性、操作描述和用户方案,测试一个产品的特性和…...
javascript选取元素的范围,可以包含父级,也可以不包含父级
//函数可以选取元素的范围,对于要选取文本的非常方便,或选取特定的子节点 function getRange(element){//判断是否支持range范围选取var supdocument.implementation.hasFeature("Range","2.0");var also(typeof document.createRan…...
QGIS怎么修改源代码?持续更新...
修改配置文件保存位置 修改目的:放着和本地安装的其他QGIS共用一份配置文件 修改文件:core/qgsuserprofilemanager.cpp 修改位置:第37行 return basePath QDir::separator() "my_profiles";修改完毕后,再次生成一下…...
dev board sig技术文章:轻量系统适配ARM架构芯片平台
摘要:本文简单介绍OpenHarmony轻量系统移植,会分多篇 适合群体:想自己动手移植OpenHarmony轻量系统的朋友 开始尝试讲解一下系统的移植,主要是轻量系统,也可能会顺便讲下L1移植。 1.1移植类型 OpenHarmony轻量系统的…...
MyBatis之增删查改功能
文章目录 一、创建各种类二、MyBatis的各种功能 1、查询<select>2、增加<insert>3、修改<update>4、删除<delete>三、总结 前言 在MyBatis项目中编写代码实现对MySql数据库的增删查改 一、创建各种类 1、在Java包的mapper文件下创建一个接口 我创建…...
Leetcode算法入门与数组丨5. 数组二分查找
文章目录 1 二分查找算法2 二分查找细节3 二分查找两种思路3.1 直接法3.2 排除法 1 二分查找算法 二分查找算法是一种常用的查找算法,也被称为折半查找算法。它适用于有序数组的查找,并通过将待查找区间不断缩小一半的方式来快速定位目标值。 算法思想…...
拓扑关系如何管理?
在设备对接涂鸦的云端过程中,一部分设备由于自身资源或硬件配置,无法直接连接云端。而是需要通过网关进行中转,由网关代理实现和云端进行数据交互,间接实现设备接入云端。这样的设备也称为子设备。 要想实现网关代理子设备接入云…...
wordpress停用谷歌字体/外贸建站与推广如何做
转自:https://cnodejs.org/topic/548e54d157fd3ae46b233502 Mongoose 是什么? 一般我们不直接用MongoDB的函数来操作MongoDB数据库 Mongose就是一套操作MongoDB数据库的接口. Schema 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端ÿ…...
织梦wap网站模板/提高工作效率总结心得
建议77: 正确停止线程开发者总尝试对自己的代码有更多的控制。例如,“让那个还在工作的线程马上停止下来”。然而,并非我们想怎样就可以怎样的,这至少涉及两个问题。第一个问题 正如线程不能立即启动一样,线程也并不是…...
广州地铁5号线/海南seo
目录 1.市场上常见的数据库 2.数据库语句 2.1DDL语句 2.2DML数据操作语句 2.3DQL语句 2.4DCL语句 3.数据约束 4.表关系 5.数据库的三范式 6.多表查询(有关系的表) 7.子查询 1.市场上常见的数据库 Oracle Mysql SQLServer 2.数据库语句 DD…...
在线购物网站开发/网站seo的优化怎么做
首先在构造页面时 应该将页面的结构分析好。 在处理数据异步时 将数据结构进行完全的简单结构化。 使用redux时 注意返回的数据是深拷贝还是浅拷贝 否则会产生 数组不为空但是没有值的问题 使用自制数据进行列表循环时可以通过数组的某项为空来设置一些需要的特殊样式。 每个页…...
wordpress如何更新缓存/网络营销推广方式有哪些
队名 火箭少男100组长博客 林燊大哥作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭!成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作学习MSI、CUDA试运行软件并调试展示GitHub当日代码/文档签入记录(组内共享)接下来的计划 测试…...
求生之路2怎么做非官方网站/广州网站优化公司排名
题意:中文题,就不解释了。 题解:代码就像女生的裙子,越短看着越性感~~当我们选定树根,那么与他相邻为1的边最后一定会翻转奇数次才能变为0,与他相邻为偶数的边,最后一定翻转偶数次,所…...