webentwicklung-frage-antwort-db.com.de

Anweisung in Klassen-/Funktionsdefinition importieren - ist das eine gute Idee?

Ich habe ein Modul mit dem Namen util erstellt, das Klassen und Funktionen enthält, die ich häufig in Python benutze .. _. Einige von ihnen benötigen importierte Funktionen. Was sind die Vor- und Nachteile des Importierens notwendiger Dinge in der Klassen-/Funktionsdefinition? Ist es besser als import am Anfang einer Moduldatei? Ist das eine gute Idee?

40
Maciej Ziarko

Es ist der üblichste Stil, den Import von every oben in der Datei zu platzieren. PEP 8 empfiehlt es. Dies ist ein guter Grund, um damit zu beginnen. Aber das ist keine Laune, es hat Vorteile (obwohl nicht kritisch genug, um alles andere zu einem Verbrechen zu machen). Es ermöglicht das Auffinden aller Importe auf einen Blick, anstatt die gesamte Datei durchzusehen. Außerdem wird sichergestellt, dass alles importiert wird, bevor ein anderer Code (der von einigen Importen abhängig sein kann) ausgeführt wird. NameErrors sind in der Regel einfach zu lösen, können jedoch ärgerlich sein.

Es ist keine (signifikante) Namensraumverschmutzung zu vermeiden, indem das Modul in einem kleineren Umfang gehalten wird, da Sie lediglich das eigentliche Modul hinzufügen ( nein, import * zählt nicht und sollte wahrscheinlich sowieso nicht verwendet werden ). Innerhalb von Funktionen würden Sie bei jedem Anruf erneut importieren (nicht wirklich schädlich, da alles einmal importiert wird, aber nicht aufgerufen wird).

44
user395760

PEP8 , der Python-Styleguide, besagt Folgendes:

Importe werden immer an die Spitze von .__ gestellt. die Datei, direkt nach einem beliebigen Modul Kommentare und Dokumentstrings sowie vor Modul-Globals und -Konstanten.

Natürlich ist dies keine feste Regel, und Importe können überall hingehen, wo Sie möchten. Sie an die Spitze zu setzen, ist jedoch der beste Weg, um das zu erreichen. Sie können natürlich auch innerhalb von Funktionen oder einer Klasse importieren.

Beachten Sie jedoch, dass Sie dies nicht tun können:

def foo():
    from os import *

Weil:

SyntaxWarning: import * only allowed at module level
12
user225312

Die anderen Antworten stimmen zwar größtenteils, aber es gibt einen Grund, warum python dies zulässt.

Es ist nicht klug, überflüssiges Material zu importieren, das nicht benötigt wird. Wenn Sie also z. Parsen Sie XML in einen Elementbaum. Wenn lxml verfügbar ist und Sie den langsam eingebauten XML-Parser nicht verwenden möchten, müssen Sie dies in dem Moment überprüfen, in dem Sie den Parser aufrufen müssen.

Und anstatt mir zu Beginn die Verfügbarkeit von lxml zu merken, würde ich es vorziehen, try zu importieren und lxml zu verwenden, except ist es nicht da. In diesem Fall würde ich auf das integrierte Modul xml zurückgreifen.

2
flying sheep

Wie die Antwort des Fliegens von Schafen stimme ich zu, dass die anderen Recht haben, aber ich setze Importe an anderen Orten ein, wie in __init__()-Routinen und Funktionsaufrufen, wenn ich Code entwickle. Nachdem meine Klasse oder Funktion getestet wurde und sich beim Importieren bewährt hat, gebe ich normalerweise ein eigenes Modul mit dem Import gemäß den PEP8-Richtlinien. Ich mache das, weil ich manchmal vergessen habe, Importe zu löschen, nachdem Code geändert oder alter Code mit schlechten Ideen entfernt wurde. Indem ich die Importe innerhalb der Klasse oder Funktion halte, die gerade entwickelt wird, spezifiziere ich die Abhängigkeiten, wenn ich sie an anderer Stelle kopieren oder in ein eigenes Modul einführen möchte.

2
Will Charlton

Ich glaube, es ist die beste Methode (gemäß einigen PEPs), dass Sie Importanweisungen am Anfang eines Moduls aufbewahren. Sie können einer __init__.py-Datei Importanweisungen hinzufügen, die dieses Modul in alle Module des Pakets importieren.

Also ... es ist sicherlich etwas, das Sie so machen können, wie Sie es tun, aber es ist entmutigt und eigentlich unnötig.

2
Ramy

Verschieben Sie Importe nur in einen lokalen Bereich, z. B. in eine Funktionsdefinition, wenn ein Problem gelöst werden muss, z. B. Umlaufimport zu vermeiden, oder die Initialisierungszeit eines Moduls zu reduzieren. Diese Technik ist besonders hilfreich, wenn viele Importe nicht erforderlich sind, je nachdem, wie das Programm ausgeführt wird. Möglicherweise möchten Sie auch Importe in eine Funktion verschieben, wenn die Module immer nur in dieser Funktion verwendet werden. Beachten Sie, dass das erstmalige Laden eines Moduls aufgrund der einmaligen Initialisierung des Moduls teuer sein kann. Das mehrmalige Laden eines Moduls ist jedoch praktisch kostenlos und kostet nur einige Nachschlagewerke. Selbst wenn der Modulname den Gültigkeitsbereich überschritten hat, ist das Modul wahrscheinlich in sys.modules verfügbar.

https://docs.python.org/3/faq/programming.html#what-are-the-best-practices-for-using-import-in-a-module

0
N.Y