又一个进口修复工具

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用HSET函数在redis中保存keyvalue   如何选择Tomcat上下文。Java代码中通过SpEL表达式的xml参数   java可以在javassist中访问Groovy脚本中声明的类吗?   java Lucene setPositionIncrement不起作用   有没有办法用Java调用shell脚本,并通过Java类为shell脚本变量设置值   java堆算法在列表中的实现   java如何让TTS在一个应用程序中以不同的语言表达?   java重构并在遍历枚举结构时删除case语句   java Android获取附近地点的列表   选定id后,java应用程序强制停止   如何用java显示消息对话框   java如何按日期和增量设置文本?   java如何按照依赖关系的顺序正确加载项目的类?   java在尝试为实体添加标识符时遇到问题   如何从Java字节码判断局部变量是否为“final”?(与BCEL相关)   neo4j中的java节点级安全性   java我在libGDX中缺少什么来获取Actor上的InputEvent?   java RecycleView不显示任何数据   Java中无构造函数创建子类实例的继承