Gibt es ein empfohlenes Format für mehrzeilige Importe?


113

Ich habe gelesen, dass es drei Möglichkeiten gibt, mehrzeilige Importe in Python zu codieren

Mit Schrägstrichen:

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

Duplizieren von Senteces:

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

Mit Klammern:

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

Gibt es ein empfohlenes Format oder einen eleganteren Weg für diese Aussagen?


3
Warum nicht einfach bei so vielen Importen from Tkinter import *?
Inbar Rose

2
Dies ist ein Beispiel. Die eigentliche Aussage ist, from data.forms import AddressEmbeddedField, PhoneEmbeddedField, MailEmbeddedField, \ WebEmbeddedFieldaber nicht alle restlichen eingebetteten Felder in data.forms importieren wollen
Manuel Alvarez

18
Viele Gründe. Beispielsweise könnten Sie viele Variablen überschreiben, die Sie nicht kennen. Kennen Sie alle Namen, die von importiert wurden from Tkinter import *? Ich bin nicht. Und IDEs wissen nicht, ob diese Namen (möglicherweise) vorhanden sind, sodass sie nicht erkennen können, ob Sie einen ungültigen Namen eingegeben haben.
Thorsten Kranz

2
@InbarRose Es ist ein schlechter Habbit, schauen Sie auf stackoverflow.com/questions/3615125/…
Yuval Pruss

Antworten:


161

Persönlich gehe ich beim Importieren von mehr als einer Komponente in Klammern und sortiere sie alphabetisch. Wie so:

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

Dies hat den zusätzlichen Vorteil, dass Sie leicht sehen können, welche Komponenten in jedem Commit oder PR hinzugefügt / entfernt wurden.

Insgesamt ist es jedoch eine persönliche Präferenz und ich würde Ihnen raten, mit dem zu gehen, was für Sie am besten aussieht.


3
Ich denke, das Wichtigste ist, konsequent zu sein (zumindest innerhalb eines bestimmten Projekts). Auf diese Weise kann jemand, der den Code liest, ohne große Schwierigkeiten herausfinden, was importiert wird.
Blckknght

1
isort kann verwendet werden, um mehrzeilige Importe in verschiedenen Stilen automatisch zu formatieren, siehe github.com/timothycrosley/isort#multi-line-output-modes
Motin


4

Ich würde mit der Klammernotation aus dem PEP328 mit Zeilenumbrüchen vor und nach Klammern gehen:

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

Dies ist das Format, das Django verwendet:

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,
)

Nach / vor der Klammer in PEP 328 werden keine Zeilenumbrüche hinzugefügt.
Gandalf Saxe

Bei @GandalfSaxe PEP 328 ging es um Semantik (Hinzufügen einer neuen Funktion zur Sprache), nicht um Formatierung.
Max Malysh

Ich verstehe das dann nicht ganz. Sie zitieren PEP 328 als Klammer für mehrzeilige Importe, aber sie haben keine? "Ich würde mit der Klammernotation aus dem PEP328 mit Zeilenumbrüchen vor und nach Klammern gehen:"
Gandalf Saxe

PEP 328 fügte der Sprache eine Klammernotation hinzu. Die Klammernotation ist die Möglichkeit, mehrere Module wie folgt zu importieren : from foo import (bar, baz). PEP 328 sagt nichts über die Formatierung aus.
Max Malysh

Ah ok, ich verstehe, was du jetzt meinst :)
Gandalf Saxe

-4

Normalerweise ist es mit Tkinter in Ordnung, nur zu verwenden, from Tkinter import *da das Modul nur Namen exportiert, die eindeutig Widgets sind.

In PEP 8 sind keine Konventionen für einen solchen Fall aufgeführt. Ich denke, es liegt an Ihnen, zu entscheiden, welche Option die beste ist. Es geht nur um Lesbarkeit. Wählen Sie also, was auch immer deutlich macht, dass Sie Inhalte aus einem einzelnen Modul importieren.

Da all diese Namen in Ihrem Bereich verfügbar sind, denke ich persönlich, dass Option 2 am klarsten ist, da Sie die importierten Namen am besten sehen können. Sie könnten es dann sogar mehr aufteilen, um vielleicht die Namen zu gruppieren, die zueinander gehören. In Ihrem Beispiel könnte ich und separat setzen Tk, wie sie Widgets gruppieren, während und separat, da sie kleinere Komponenten in einer Ansicht sind.FrameCanvasButtonText


10
Nie ist OK von X Import zu verwenden *
Tolo Palmer

1
@ToloPalmer Normalerweise stimmt das, aber für Tkinter ist dies im Allgemeinen in Ordnung, da Sie nur Widgets importieren. es ist sogar so in der Bibliotheksreferenz aufgeführt . Und wenn Sie den Import als ersten auflisten, sollten Sie vor Konflikten besonders sicher sein.
stupsen

1
Als Referenz besteht das Problem from X import *auch bei Paketen, die __all__ordnungsgemäß verwendet werden, darin, dass statische Code-Analysatoren wie pyflakeskeine undefinierten Namen erkennen können, wenn es welche gibt, import *da davon ausgegangen werden muss, dass undefinierte Namen möglicherweise von der importiert wurden *.
RubenLaguna
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.