GitHubじゃ!Pythonじゃ!

GitHubからPython関係の優良リポジトリを探したかったのじゃー、でも英語は出来ないから日本語で読むのじゃー、英語社会世知辛いのじゃー

timothycrosley

isort – インポートをソートするためのPythonユーティリティ/ライブラリ

投稿日:

インポートをソートするためのPythonユーティリティ/ライブラリ。


あなたのためにあなたのpythonのインポートをisortする必要はありません。

isortは、インポートをアルファベット順にソートし、自動的にセクションに分割するためのPythonユーティリティ/ライブラリです。 コマンドラインユーティリティ、 さまざまなエディタ用の Pythonライブラリとプラグインを使用して、すべてのインポートをすばやくソートできます。 現在のところ、Python 2.7 – 3.6は何の依存関係もなく完全にサポートしています。

isortの前に:

from my_lib import Object

print("Hey")

import os

from my_lib import Object3

from my_lib import Object2

import sys

from third_party import lib15, lib1, lib2, lib3, lib4, lib5, lib6, lib7, lib8, lib9, lib10, lib11, lib12, lib13, lib14

import sys

from __future__ import absolute_import

from third_party import lib3

print("yo")

isortの後:

from __future__ import absolute_import

import os
import sys

from third_party import (lib1, lib2, lib3, lib4, lib5, lib6, lib7, lib8,
                         lib9, lib10, lib11, lib12, lib13, lib14, lib15)

from my_lib import Object, Object2, Object3

print("Hey")
print("yo")

isortのインストール

isortのインストールは以下のように簡単です:

pip install isort

またはあなたが好きなら

easy_install isort

isortの使用

コマンドラインから

isort mypythonfile.py mypythonfile2.py

または再帰的に:

isort -rc .

これは以下と同等です:

isort **/*.py

または提案された変更を適用せずに確認することができます。

isort mypythonfile.py --diff

最後に、isortをプロジェクトに対してアトミックに実行するには、構文エラーが発生しない場合にのみ変更を適用します。

isort -rc --atomic .

(注意:これはisortが別のバージョンのPythonを使って書かれたコードに対して実行できないようにするため、デフォルトでは無効になっています)

Python内から

from isort import SortImports

SortImports("pythonfile.py")

または:

from isort import SortImports

new_contents = SortImports(file_contents=old_contents).output

ケイト内から:

ctrl+[

または:

menu > Python > Sort Imports

isortのKateプラグインのインストール

KDE 4.13+ / Pate 2.0+の場合:

wget https://raw.github.com/timothycrosley/isort/master/kate_plugin/isort_plugin.py --output-document ~/.kde/share/apps/kate/pate/isort_plugin.py
wget https://raw.github.com/timothycrosley/isort/master/kate_plugin/isort_plugin_ui.rc --output-document ~/.kde/share/apps/kate/pate/isort_plugin_ui.rc
wget https://raw.github.com/timothycrosley/isort/master/kate_plugin/katepart_isort.desktop --output-document ~/.kde/share/kde4/services/katepart_isort.desktop

すべての古いバージョン:

wget https://raw.github.com/timothycrosley/isort/master/kate_plugin/isort_plugin_old.py --output-document ~/.kde/share/apps/kate/pate/isort_plugin.py

その後、kortを再起動して、Python Pluginsとisortプラグイン自体を有効にする必要があります。

あなたの好みのテキストエディタ用のisortをインストールする

さまざまなテキストエディタ内からisortを使用できるようにするプラグインがいくつか作成されています。 あなたはそれらの完全なリストをisort wikiで見つけることができます さらに、他のテキストエディタ用のプラグインを含むプルリクエストを熱心に受け入れ、通知されたときにドキュメントを追加します。

isortはどのように機能しますか?

isortは、グローバルレベルのインポート行(try / exceptブロック、関数などの外部からのインポート)用に指定されたファイルを解析し、インポートの種類ごとにグループ化されたファイルの先頭にすべてを配置します。

  • 未来
  • Python標準ライブラリ
  • 第三者
  • 現在のPythonプロジェクト
  • 明示的にローカル(。importの前にfrom . import xfrom . import x
  • カスタムセクションセクション(構成ファイルのforced_separateリストで定義)
  • カスタムセクション(設定ファイルのセクションリストで定義)

各セクションの内部では、インポートはアルファベット順にソートされます。 isortは自動的に重複したpythonのインポートを取り除き、インポートから指定された行の長さ(デフォルトは80)まで長いものをラップします。

いつisortは動作しませんか?

トップレベルのインポートの途中でtry / exceptブロックを持つ必要がある場合や、インポートオーダーが優先順位に直接リンクされている状況がある場合。

たとえば、Djangoの設定ファイルでは、さまざまな設定ファイルから*をインポートして新しい設定ファイルを作成しています。 この場合、インポートのいずれかが注文を変更すると、設定定義自体が変更されます。

しかし、これらのファイルだけをスキップするようにisortを設定することもできますし、特定のインポートを強制的にトップにすることもできます。

isortの設定

あなたのプロジェクトでデフォルトのisort設定がうまくいかない場合、isortは動作を調整するいくつかの方法を提供します。

単一ユーザのisortを設定するには、 ~/.isort.cfgファイルを作成します。

[settings]
line_length=120
force_to_top=file1.py,file2.py
skip=file3.py,file4.py
known_future_library=future,pies
known_standard_library=std,std2
known_third_party=randomthirdparty
known_first_party=mylib1,mylib2
indent='    '
multi_line_output=3
length_sort=1
forced_separate=django.contrib,django.utils
default_section=FIRSTPARTY
no_lines_before=LOCALFOLDER

さらに、プロジェクトのルートに.isort.cfgファイルを配置するだけで、プロジェクトレベルの構成を指定することができます。 isortは、実行されたファイルから最大25のディレクトリを検索し、プロジェクト固有の設定を検索します。

または、必要に応じて、プロジェクトのtox.iniファイルまたはtox.iniファイルにisortセクションを任意の設定で追加することができます。

これらの設定は、コマンドライン引数を使用するか、SortImportsクラスにオーバーライド値を渡すことでオーバーライドできます。

最後に、バージョン3.0のisortは、ここで定義されている標準の構文を使用して、editorconfigファイルをサポートしています: http ://editorconfig.org/

つまり、 *.pyセクションの下の.editorconfigファイル内に標準のisort設定パラメータを置くと、それらの設定パラメータが使用されます。

isort設定とその意味の完全なリストについては、isort wikiを見てください

マルチライン出力モード

“multi_line_output”設定の上に気づくでしょう。 この設定では、line_lengthの制限を超えて6つの設定が可能な場合、インポートがどのように折り返されるかを定義します。

0 – グリッド

from third_party import (lib1, lib2, lib3,
                         lib4, lib5, ...)

1 – 垂直

from third_party import (lib1,
                         lib2,
                         lib3
                         lib4,
                         lib5,
                         ...)

2 – インデントを挟む

from third_party import \
    lib1, lib2, lib3, \
    lib4, lib5, lib6

3 – 垂直吊りインデント

from third_party import (
    lib1,
    lib2,
    lib3,
    lib4,
)

4 – ハンギンググリッド

from third_party import (
    lib1, lib2, lib3, lib4,
    lib5, ...)

5 – ハンギンググリッドグループ化

from third_party import (
    lib1, lib2, lib3, lib4,
    lib5, ...
)

6 – NOQA

from third_party import lib1, lib2, lib3, ...  # NOQA

あるいは、 force_single_lineTrue (コマンドラインで-sl )に設定すると、すべてのインポートがそれ自身の行に表示されます。

from third_party import lib1
from third_party import lib2
from third_party import lib3
...

注:インデントの表示方法を変更するには、次のフォーマットでインデントプロパティを変更します。*空白の数。 例:4は、標準の4スペースインデントを引き起こします。 * Tab *引用符で囲まれた逐語的な文字列。

例えば:

"    "

4に相当します。

カッコを使用するインポートスタイルでは、最後のインポート後にinclude_trailing_commaオプションを使用して末尾にカンマを含めるかどうかを制御できます(デフォルトはFalse )。

インテリジェントにバランスされた複数行のインポート

isort 3.1.0以降、複数行のバランスの取れたインポートのサポートが追加されました。 この有効化されたisortは、定義された最大インポート長を下回りながら、インポートされた長さを最もバランスのとれたグリッドを生成するものに動的に変更します。

例:

from __future__ import (absolute_import, division,
                        print_function, unicode_literals)

次の代わりに製造されます:

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

設定でbalanced_wrappingTrueに設定するには、コマンドラインユーティリティに-eオプションを渡します。

カスタムセクションとオーダー

sectionsオプションを使用してセクションの順序をデフォルトから変更することができます:

FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,LOCALFOLDER

あなたの好みに合わせて:

sections=FUTURE,STDLIB,FIRSTPARTY,THIRDPARTY,LOCALFOLDER

独自のセクションとその順序を定義することもできます。

例:

known_django=django
known_pandas=pandas,numpy
sections=FUTURE,STDLIB,DJANGO,THIRDPARTY,PANDAS,FIRSTPARTY,LOCALFOLDER

指定された既知のモジュールで2つの新しいセクションが作成されます。

no_lines_beforeオプションは、リストされたセクションが前のセクションから空の行で分割されないようにします。

例:

sections=FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,LOCALFOLDER
no_lines_before=LOCALFOLDER

FIRSTPARTYとLOCALFOLDERの両方のモジュールを組み合わせたセクションが生成されます。

自動コメントのインポートセクション

一部のプロジェクトでは、視覚的にスキャンするときにセクションをすばやく特定するのに役立つように、インポートセクションに一意のタイトルが付いています。 isortもこれを自動化できます。 これを行うには、自動コメントを付ける各import_heading_{section_name}import_heading_{section_name}設定を目的のコメントに設定します。

例えば:

import_heading_stdlib=Standard Library
import_heading_firstparty=My Stuff

出力は次のようになります。

# Standard Library
import os
import sys

import django.settings

# My Stuff
import myproject.test

輸入の長さによる注文

isortは、 length_sortオプションをTrue設定するだけで、インポートの長さを簡単に並べ替えることもできます。 これにより、次の出力スタイルが生成されます。

from evn.util import (
    Pool,
    Dict,
    Options,
    Constant,
    DecayDict,
    UnexpectedCodePath,
)

インポート処理をスキップする(設定外)

isortが単一のインポートを無視するようにするには、テキストisort:skipを含むインポート行の最後にコメントを追加するだけisort:skip

import module  # isort:skip

または:

from xyz import (abc,  # isort:skip
                 yo,
                 hey)

isortをファイル全体をスキップさせるには、モジュールのドキュメント文字列にisort:skip_fileを追加するだけです:

""" my_module.py
    Best module ever

   isort:skip_file
"""

import b
import a

複数のファイルにインポートを追加する

isortを使うと、複数のファイルにインポートステートメントを簡単に追加できます。

コマンドラインから:

isort -a "from __future__ import print_function" *.py

ケイト内から:

ctrl+]

または:

menu > Python > Add Import

複数のファイルからのインポートの削除

isortは、もともとどのようにフォーマットされていたかに関わらず、複数のファイルからインポートを簡単に削除することを可能にします。

コマンドラインから:

isort -r "os.system" *.py

ケイト内から:

ctrl+shift+]

または:

menu > Python > Remove Import

isortを使ってコードを検証する

--check-onlyオプション

isortを使用して、 -cを指定してコードを実行することによって、コードの形式が正しいことを確認することもできます。 間違ってソートされたインポートやフォーマットされたインポートを含むファイルはすべてstderrに出力されます。

isort **/*.py -c -vb

SUCCESS: /home/timothy/Projects/Open_Source/isort/isort_kate_plugin.py Everything Looks Good!
ERROR: /home/timothy/Projects/Open_Source/isort/isort/isort.py Imports are incorrectly sorted.

これを使うことができる1つの素晴らしい場所は、@ acdhaによるこのようなpre-commit gitフックです:

https://gist.github.com/acdha/8717683

これにより、プロジェクト全体で一定レベルのコード品質を保証することができます。

ジットフック

isortは、コミットする前にGitプリコミットスクリプトに統合してPythonコードをチェックできるフック関数を提供します。

isortエラー(strictモード)がある場合にコミットが失敗するようにするには、 .git/hooks/pre-commit次の行を.git/hooks/pre-commitします。

#!/usr/bin/env python
import sys
from isort.hooks import git_hook

sys.exit(git_hook(strict=True))

警告を表示したいが、とにかくコミットを許可したい場合は、strictパラメータなしでgit_hookを呼び出します。

Setuptoolsの統合

インストール時に、isortはプロジェクトによって宣言されたPythonファイルをチェックするsetuptoolsコマンドを有効にします。

コマンドラインでpython setup.py isortを実行すると、 py_modulespackagesリストされているファイルがチェックされます。 警告が見つかると、コマンドはエラーコードで終了します。

$ python setup.py isort

また、ユーザーがisortをインストールすることなくコマンドを使用できるようにするには、 setup() setup_requiresにisortを次のように追加します。

setup(
    name="project",
    packages=["project"],

    setup_requires=[
        "isort"
    ]
)

なぜisort?

isortは単純にインポートの並べ替えを表します。 それはもともと「sortImports」と呼ばれていましたが、余分な文字を入力するのに疲れてしまい、キャメルケースがpythonicではないことに気づきました。

私はマネージャーで働いていた組織ではいつか来て、すべてのコードがアルファベット順にソートされた輸入品を持っていなければならないと決めたので、私はisortを書いた。 コードベースは巨大で、彼は私たちが手でそれを行うことを意味していました。 しかし、プログラマであることは、私は機能を無意識のうちに実行するのに8時間を費やすのは面倒ですが、それを自動化するのに16時間を費やすのはあまりにも怠惰ではありません。 私はソースsortImportsをオープンする許可を与えられました。ここにあります:)


ありがとうと私はあなたがisort便利見つけることを願っています!

〜ティモシー・クロスレイ







-timothycrosley

執筆者:


  1. […] 手動で扱うのが手間な場合は、Jupyterであればisort formatterなどの拡張機能、.pyファイルであればisortライブラリなどを利用すると楽ができます。 […]

  2. […] 手動で扱うのが手間な場合は、Jupyterであればisort formatterなどの拡張機能、.pyファイルであればisortライブラリなどを利用すると楽ができます。 […]

関連記事