又一个进口修复工具
zimports的Python项目详细描述
重新格式化python导入,以便它们可以传递flake8导入顺序。这是 大致如下:
- 每行一次导入
- 按字母顺序排序,有点的样式选项,区分大小写, 并对虚线名称进行排序
- 按内置/外部库/当前应用程序分组(也 风格可控)
- 删除未使用的导入,使用pyflakes匹配“未使用的导入”警告 到实际的代码行
- 删除了重复的导入(注意,这还不包括重复的符号 不同进口商品的名称)
- 没有星形导入(例如from <foo> import *);它们被重写为 显式名称,从每个目标模块导入所有名称,然后 删除所有未使用的名称。
程序当前将自身固定在flake8-import-order之上,以便重用导入 工具提供的分类和排序样式。没有选择, 脚本将直接查找带有^{tt3}的setup.cfg文件$ 段,并将使用flake8导入顺序参数"application-import- names"、"application-package-names"和"import-order-style",以 将导入的内容按这个linter期望的那样进行排序,然后找到它们。所有的 单行导入样式,例如google、cryptography、pycharm,应该只是 工作。
可对进口产品进行特殊分类,如“noqa”注释 指示不应删除导入,并且可以选择 注释“noqa nosort”将把导入放入一个特殊的 “不排序”类别,将所有“不排序”导入按顺序排列 它们最初出现,在所有已排序的导入之后分组。这个罐头 用于一些特殊情况,其中一些进口必须在 相互排序(sqlalchemy目前有两行这样的代码)。
应用程序也不影响条件中的导入。 或变形,或以任何方式缩进。这也是 flake8导入顺序;只有源文件第0列中的导入是 虽然在其他定义下面的行上的导入是 已计数,将上移到源文件的顶部。
注意
此应用程序仅在python 3中运行。它可以重新格式化 python 2代码的导入,但在内部它使用库 语言特性仅在Python3中可用。
zzzeek为什么要编写其中一个,有十几个pep8导入修复程序
我刚经历了一大堆。我需要一个:
- 与Flake8进口订单直接合作,因此我们保证匹配
- 具有shell功能,不仅是vim或sublime text的插件(python fix 进口,免费)
- 删除未使用的导入,而不仅仅是重新格式化它们(importanize)
- 重新格式化导入,而不仅仅是删除未使用的导入(autoflake)
- 不错过删除不使用的导入,因为它位于 多行导入(autoflake)
- 将all导入拆分为单独的行,而不仅仅是行是>;80个字符 (重要)
- 仍然很简单(我们有点超出了最初的“极其”简单 基线,因为所有的问题最终都不是那么简单 这是一个 非常简单的工作,这里(仍然)不需要一个巨大的应用程序。
用法
脚本可以在不进行任何配置的情况下运行,选项如下:
$ zimports --help usage: zimports [-h] [-m APPLICATION_IMPORT_NAMES] [-p APPLICATION_PACKAGE_NAMES] [--style STYLE] [-k] [--heuristic-unused HEURISTIC_UNUSED] [--statsonly] [-e] [--diff] [--stdout] filename [filename ...] positional arguments: filename Python filename(s) or directories optional arguments: -h, --help show this help message and exit -m APPLICATION_IMPORT_NAMES, --application-import-names APPLICATION_IMPORT_NAMES comma separated list of names that should be considered local to the application. reads from [flake8] application-import-names by default. -p APPLICATION_PACKAGE_NAMES, --application-package-names APPLICATION_PACKAGE_NAMES comma separated list of names that should be considered local to the organization. reads from [flake8] application-package-names by default. --style STYLE import order styling, reads from [flake8] import- order-style by default, or defaults to 'google' -k, --keep-unused keep unused imports even though detected as unused --heuristic-unused HEURISTIC_UNUSED Remove unused imports only if number of imports is less than <HEURISTIC_UNUSED> percent of the total lines of code --statsonly don't write or display anything except the file stats -e, --expand-stars Expand star imports into the names in the actual module, which can then have unused names removed. Requires modules can be imported --diff don't modify files, just dump out diffs --stdout dump file output to stdout
通常,flake8(支持 todo是tox.ini,pyproject.toml):
[flake8] enable-extensions = G ignore = A003, E203,E305,E711,E712,E721,E722,E741, F841, N801,N802,N806, W503,W504 import-order-style = google application-import-names = sqlalchemy,test
然后,在一个基本干净的源代码树上的典型运行如下所示:
$ zimports lib/ [Unchanged] lib/sqlalchemy/inspection.py (in 0.0058 sec) [Unchanged] lib/sqlalchemy/log.py (in 0.0221 sec) ... [Unchanged] lib/sqlalchemy/orm/attributes.py (in 0.2152 sec) [Unchanged] lib/sqlalchemy/orm/base.py (in 0.0363 sec) [Writing] lib/sqlalchemy/orm/relationships.py ([2% of lines are imports] [source +0L/-2L] [3 imports removed in 0.3287 sec]) [Unchanged] lib/sqlalchemy/orm/strategies.py (in 0.2237 sec)
这个程序有两种通用的使用方式。一是日常使用 对于已经有干净导入的应用程序。运行Zimports 此类应用程序的源文件不应产生任何更改,除非 无论源文件是什么编辑过,可能对 需要按正确顺序排列的导入。这种使用模式是 类似于Black,在这里您可以运行 “Zimports”,它会找到任何需要调整的文件,剩下的就留下 一个人。
另一种使用方式是预先清理应用程序 有未经组织的进口。在这种使用模式下,目标是 要清理的源文件,以便zimports可以直接运行 不需要对文件进行任何修改,包括 导入或在本地使用,或标记为不删除。
在这个阶段可能出现的问题是一些导入未使用,并且 应该删除,而其他显然未使用的导入仍在 程序其他部分导入的事实。另一个问题是改变 在复杂情况下对导入进行排序可能会导致应用程序不再 由于创建了无法解析的导入周期而运行。最后,一些 程序使用import *,为其拉入一个大的名称列表 应用程序需要其中的未知部分。选项 --keep-unused、--heuristic-unused和--expand-stars是 提供以帮助解决这些问题,直到代码可以 完全重新格式化,使运行zimports不再产生更改。
显然未使用的外部进口的问题可以是 在某些应用中突出。以便允许非本地的导入 用于保留在源文件中,作为 __all__不会被删除,后面跟着``# noqa``评论。这些技术中的任何一种都应该应用于 从其他模块中使用,但不在 源文件。对于少数进口产品确实需要 特定的导入顺序,这些导入之后可以`` #noqa nosort``将这些行添加到末尾的特殊组的注释 在所有的进口中,它们不会被删除,它们的顺序 另一个将被保留。
程序当前要求您至少传递一个文件或 作为参数的目录名。它也没有文件缓存功能 黑色的,它可以让它只查看已经更改的文件 从上次跑步开始。计划是让它检查它是否在一个git中 存储库,如果没有文件名,它将在其中运行要提交的文件 鉴于。
用作githook
zimports可以与pre-commitgit hooks框架一起使用。添加 插件,将以下内容添加到您的.pre-commit-config.yaml:
-repo:https://github.com/sqlalchemyorg/zimportsrev:''# pick a hash or tag to point tohooks:-id:zimports