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.

War es hilfreich?

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, aber os.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:

  1. Ich verwende zu viele der Modulfunktionen / Objekte sie alle
  2. importieren
  3. Das Modul definiert eine Symbol, das während der Ausführung
  4. ä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.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top