'Von X importieren' versus ‚import X; X.a‘
-
06-07-2019 - |
Frage
Ich habe einige Python-Programmierer die folgenden Stil ziemlich konsequent nutzen gesehen (wir nennen es Stil 1):
import some_module
# Use some_module.some_identifier in various places.
Zur Unterstützung dieses Stils, können Sie die "explicit ist besser als implizite „ Maxime. Ich habe andere Programmierer diesen Stil verwenden gesehen (Art 2):
from some_module import some_identifier
# Use some_identifier in various places.
Der primäre Vorteil, dass ich in der Art zu sehen 2 ist Wartbarkeit - vor allem mit Ente eingeben Ideale ich kann some_module für some_other_module tauschen wollen. Ich fühle mich Stil auch 2 Siege Punkte mit der „Lesbarkeit zählt“ Maxime. Obwohl ich eher nicht zustimmen, kann man immer argumentieren, dass die Such- und ersetzen genauso gut eine Option ist, wenn die erste Art verwendet wird.
Nachtrag: Es wurde festgestellt, dass Sie as
verwenden könnte die Umstellung von some_module
zu lösen in der Art 1. Ich vergaß zu erwähnen some_other_module
, dass es auch üblich ist, zu entscheiden, some_identifier
in Ihre Strom Modul, das etwas umständlich Schaffung eines gleichwertigen some_module
Behälter macht.
Lösung
Es gibt Anwendungen für beide Fälle, so dass ich glaube nicht, das ist ein Entweder-oder Thema.
Ich würde prüfen, aus dem Modul import x,y,z
verwenden, wenn:
-
Es gibt eine ziemlich kleine Anzahl von Dingen zu importieren
-
Der Zweck der importierten Funktionen liegt auf der Hand, wenn sie aus dem Modulnamen geschieden. Wenn die Namen ziemlich allgemein sind, können sie mit anderen kollidieren und Sie wenig sagen. z.B.
remove
Sehen Sie sagt wenig, aberos.remove
wahrscheinlich andeuten, dass Sie mit Dateien zu tun hat. -
Die Namen kollidieren nicht. Ähnlich wie oben, aber noch wichtiger. Nie so etwas wie:
from os import open
import module [as renamed_module]
hat den Vorteil, dass es ein bisschen mehr Kontext darüber gibt, was genannt wird, wenn Sie es verwenden. Es hat den Nachteil, dass dies ein bisschen mehr überladen ist, wenn das Modul nicht wirklich mehr Informationen geben, und ist etwas weniger performant (2-Lookups statt 1).
Es hat auch Vorteile, wenn jedoch die Prüfung (z. B. mit einem Mock-Objekt ersetzt os.open, ohne jedes Modul ändern zu müssen), und soll verwendet werden, wenn veränderbare Module verwenden, z.
import config
config.dburl = 'sqlite:///test.db'
Im Zweifelsfall würde ich immer mit dem import module
Stil gehen.
Andere Tipps
Mit der Existenz der folgenden Syntax:
import some_other_module as some_module
das Wartbarkeit Argument der Art 2 ist nicht mehr relevant.
Ich neige dazu, Stil 1. Normalerweise zu verwenden, finde ich, dass ich die importierten Paketnamen nur ein paar Mal in einem typischen Python-Programm explizit verweisen. Alles andere ist Methoden für das Objekt, was natürlich nicht das importierte Paket verweisen müssen.
Normalerweise verwende ich eine Schwelle, dies zu entscheiden. Wenn ich eine Menge Dinge in some_module
verwenden möchten, werde ich verwenden:
import some_module as sm
x = sm.whatever
Wenn es nur ein oder zwei Dinge, die ich brauche:
from some_module import whatever
x = whatever
Das ist vorausgesetzt, ich brauche keinen whatever
von some_other_module
, natürlich.
Ich neige dazu, die as
Klausel für die Einfuhren zu verwenden, so dass ich meine Eingabe reduzieren und substitue ein weiteres Modul ganz einfach in der Zukunft.
Ich bevorzuge es import X
und dann X.a
so viel wie möglich.
Meine Ausnahme konzentriert sich auf die tief verschachtelten Module in einem großen Rahmen wie Django. Ihre Modulnamen sind in der Regel langwierig zu bekommen, und ihre Beispiele alle sagen from django.conf import settings
Sie speichern django.conf.settings.DEBUG
eingeben überall.
Wenn der Modulname tief verschachtelt ist, dann ist die Ausnahme from X.Y.Z import a
verwenden.
Ich finde, dass die Notation
from some_module import some_symbol
funktioniert am besten in den meisten Fällen. Auch bei der Namensgebung für das Symbol, können Sie:
from some_module import some_symbol as other_symbol
Wie die Frage Staaten, vermeidet es dem Modulnamen die ganze Zeit Umschreiben, jedes Mal mit einem Risiko der Tippfehler. Ich verwende die Syntax:
import module [as other_module]
Nur in zwei Fällen:
- Ich verwende zu viele der Modulfunktionen / Objekte sie alle importieren
- Das Modul definiert eine Symbol, das während der Ausführung ändern
ich persönlich nicht versuchen, Chaos zu viel mit meinem Namensraum, so in den meisten Situationen, die ich tue, nur
import module
oder Importmodul als mod
Nur echte diffrence ist, wenn ich ein Modul mit einer einzigen Klasse, die viel verwendet wird. Wenn ich einen list
Typ sublclassed hatte einige funcionality dort hinzufügen, würde ich verwenden
from SuperImprovedListOverloadedWithFeatures import NewLIst
nl = NewList()
etc.
Ich neige dazu, nur ein paar Mitglieder der einzelnen Module zu verwenden, so gibt es eine Menge von
from john import cleese
from terry import jones, gilliam
in meinem Code. Ich werde importieren ganze Module (wie os
oder wx
), wenn ich erwarte, dass der größte Teil des Moduls zu verwenden und der Modulname ist kurz. Ich werde auch ganze Module importieren, wenn es ein Namenskonflikt ist oder ich mag den Leser daran zu erinnern, was diese Funktion verknüpft ist.
import michael
import sarah
import wave
gov_speech = wave.open(sarah.palin.speechfile)
parrot_sketch = wave.open(michael.palin.justresting)
(I from wave import open as wave_open
verwenden könnte, aber ich glaube, dass wave.open
den Leser vertraut sein wird.
Sie können in Stack-Überlauf Frage interessiert sein Warum 'Import x; xy' verhalten sich anders 'von x Import y', und die erste ausfällt, wenn die Verpackung x. init nicht abgeschlossen ist? .
Ich glaube, in neueren Versionen von Python können Sie auch tun (2.5+ muss meine Fakten überprüfen ...?):
import some_other_module as some_module
So können Sie immer noch mit Stil 1 und Swap in einem anderen Modul später gehen könnten.
Ich denke, es in der Regel abbildet, wie viel wollen Sie Ihren Namensraum zu vollstopfen. Werden Sie nur in dem Modul mit einem oder zwei Namen sein? Oder alle von ihnen (from x import *
ist nicht durchweg schlecht, nur im Allgemeinen)?