複数行のインポートに推奨される形式はありますか?


114

私はPythonで複数行のインポートをコーディングするための3つの方法があることを読んだ

スラッシュ付き:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text, \
    LEFT, DISABLED, NORMAL, RIDGE, END

センテスの複製:

from Tkinter import Tk, Frame, Button, Entry, Canvas, Text
from Tkinter import LEFT, DISABLED, NORMAL, RIDGE, END

括弧付き:

from Tkinter import (Tk, Frame, Button, Entry, Canvas, Text,
    LEFT, DISABLED, NORMAL, RIDGE, END)

このステートメントに推奨される形式またはよりエレガントな方法はありますか?


3
非常に多くのインポートがあるのに、なぜただではないのfrom Tkinter import *ですか?
インバーローズ2013

2
これは一例です。実際のステートメントはfrom data.forms import AddressEmbeddedField, PhoneEmbeddedField, MailEmbeddedField, \ WebEmbeddedField、data.formsに埋め込まれた残りのフィールドをすべてインポートしたいが、したくない
Manuel Alvarez

19
多くの理由。たとえば、知らない多くの変数を上書きする可能性があります。によってインポートされたすべての名前を知っていますfrom Tkinter import *か?私は違います。また、IDEはこれらの名前(たぶん)を認識していないため、無効な名前を入力したかどうかを判別できません。
Thorsten Kranz 2013年

2
@InbarRoseそれは悪い癖、見ていstackoverflow.com/questions/3615125/...
のYuval Pruss

回答:


161

個人的には、複数のコンポーネントをインポートする場合は括弧で囲み、それらをアルファベット順にソートします。そのようです:

from Tkinter import (
    Button,
    Canvas,
    DISABLED,
    END,
    Entry,
    Frame,
    LEFT,
    NORMAL,
    RIDGE,
    Text,
    Tk,
)

これには、各コミットまたはPRで追加/削除されたコンポーネントを簡単に確認できるという追加の利点があります。

全体的には個人的な好みですが、あなたにとって一番見栄えの良いものを使うように勧めます。


3
重要なことは、一貫性を保つことです(少なくとも、特定のプロジェクト内で)。これにより、コードを読んでいる人が簡単にインポートされているものを簡単に見つけることができます。
Blckknght 2013年

1
isortを使用すると、複数行のインポートをさまざまなスタイルで自動的にフォーマットできます。github.com/ timothycrosley / isort#multi-line- output
Motin


4

括弧の前後に改行が追加されたPEP328の括弧表記を使用します。

from Tkinter import (
    Tk, Frame, Button, Entry, Canvas, Text, 
    LEFT, DISABLED, NORMAL, RIDGE, END
)

これはDjangoが使用するフォーマットです:

from django.test.client import Client, RequestFactory
from django.test.testcases import (
    LiveServerTestCase, SimpleTestCase, TestCase, TransactionTestCase,
    skipIfDBFeature, skipUnlessAnyDBFeature, skipUnlessDBFeature,
)
from django.test.utils import (
    ignore_warnings, modify_settings, override_settings,
    override_system_checks, tag,
)

PEP 328の括弧の前後に追加された改行はありませんか?
ガンダルフ

@GandalfSaxe PEP 328は、フォーマットについてではなく、セマンティクス(言語への新機能の追加)に関するものでした。
Max Malysh

その時はよくわかりません。PEP 328を複数行インポートの括弧があると引用していますが、括弧はありませんか?「PEP328の括弧表記を使用して、括弧の前後に改行を追加します。」
Gandalf Saxe

PEP 328は、言語に括弧表記を追加しました。括弧表記は、次のように複数のモジュールをインポートする機能ですfrom foo import (bar, baz)。PEP 328はフォーマットについて何も述べていません。
マリーシュマックス2018

ああ、わかりました、今あなたが何を意味しているのか分かります:)
Gandalf Saxe '

-4

通常、Tkinterではfrom Tkinter import *、モジュールが明らかにウィジェットである名前のみをエクスポートするため、そのまま使用しても問題ありません。

PEP 8はそのような場合の規則をリストしていないので、何が最良のオプションかを決めるのはあなた次第だと思います。読みやすさの問題なので、単一のモジュールからデータをインポートすることを明確にするものを選択してください。

これらの名前はすべてスコープ内で使用できるようになっているので、インポートされた名前が最もよくわかるように、個人的にはオプション2が最も明確だと思います。次に、さらに分割して、互いに属している名前をグループ化することもできます。あなたの例では、私は入れてありますTkFrameそしてCanvas持ちながら、彼らはグループが、一緒にウィジェットとして別にButtonしてText、彼らはビューの小さい要素であるとして別途。


11
Xインポートからの使用は決して問題ありません*
Tolo Palmer

1
@ToloPalmer通常はそうですが、ウィジェットのみをインポートするため、Tkinterの場合はこれで大丈夫です。ライブラリリファレンスにもそのよう記載されています。また、最初のインポートとしてリストする場合は、競合から特に安全である必要があります。
突く

1
参考までに、適切にfrom X import *使用するパッケージでも、未定義の名前がによってインポートされたと想定する必要があるため__all__、静的コードアナライザーpyflakesが未定義の名前を検出できないという問題があります。import **
RubenLaguna
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.