Nachteil jeder Form
Beim Lesen des Codes anderer Personen (und dieser Personen verwenden sehr unterschiedliche Importstile) sind mir bei jedem der Stile die folgenden Probleme aufgefallen:
import modulewithaverylongname
wird den Code weiter unten mit dem langen Modulnamen (z. B. concurrent.futures
oder django.contrib.auth.backends
) überladen und die Lesbarkeit an diesen Stellen verringern.
from module import *
gibt mir keine Chance, das zum Beispiel syntaktisch zu sehen classA
und classB
aus demselben Modul zu kommen und viel miteinander zu tun zu haben. Es macht das Lesen des Codes schwierig . (Dass Namen aus einem solchen Import möglicherweise Namen aus einem früheren Import beschatten, ist der geringste Teil dieses Problems.)
from module import classA, classB, functionC, constantD, functionE
Überlastet mein Kurzzeitgedächtnis mit zu vielen Namen, denen ich mental zuweisen module
muss, um den Code kohärent zu verstehen.
import modulewithaverylongname as mwvln
ist mir manchmal nicht ausreichend mnemonisch .
Ein geeigneter Kompromiss
Basierend auf den obigen Beobachtungen habe ich den folgenden Stil in meinem eigenen Code entwickelt:
import module
ist der bevorzugte Stil, wenn der Modulname kurz ist, wie beispielsweise die meisten Pakete in der Standardbibliothek. Dies ist auch der bevorzugte Stil, wenn ich Namen aus dem Modul nur an zwei oder drei Stellen in meinem eigenen Modul verwenden muss. Klarheit übertrumpft dann die Kürze ( "Lesbarkeit zählt" ).
import longername as ln
ist in fast allen anderen Fällen der bevorzugte Stil. Zum Beispiel könnte ich import django.contrib.auth.backends as djcab
. Nach Definition des obigen Kriteriums 1 wird die Abkürzung häufig verwendet und ist daher ausreichend leicht zu merken.
Nur diese beiden Stile sind gemäß "Explizit ist besser als implizit" vollständig pythonisch
. Regel.
from module import xx
kommt immer noch manchmal in meinem Code vor. Ich benutze es in Fällen, in denen sogar das as
Format übertrieben erscheint. Das bekannteste Beispiel ist from datetime import datetime
(aber wenn ich mehr Elemente benötige, werde ich es tun import datetime as dt
).
import pandas
undfrom pandas import DataFrame
beide sind okay. Die zweite Formfrom pandas import *
ist normalerweise nicht zu empfehlen, da sie nur alles in den globalen Namespace zieht.