python naming - Ist es pythonisch, innerhalb von Funktionen zu importieren?




4 Answers

Auf lange Sicht denke ich, dass Sie es schätzen werden, die meisten Ihrer Importe an der Spitze der Datei zu haben. Auf diese Weise können Sie auf einen Blick erkennen, wie kompliziert Ihr Modul ist, was es importieren muss.

Wenn ich einer vorhandenen Datei neuen Code hinzufüge, mache ich den Import normalerweise dort, wo er benötigt wird, und wenn der Code dann bleibt, mache ich die Dinge dauerhafter, indem ich die Import-Zeile an den Anfang der Datei verschiebe.

Ein weiterer Punkt ist, dass ich eine ImportError-Ausnahme bevorzuge, bevor ein Code ausgeführt wird - als Plausibilitätsprüfung, das ist ein weiterer Grund, oben zu importieren.

Ich benutze PyChecker, um nach unbenutzten Modulen zu suchen.

conventions files

PEP 8 sagt:

  • Imports werden immer an den Anfang der Datei gesetzt, direkt nach den Modulkommentaren und Docstrings und vor den Modul-Globalen und -Konstanten.

Bei der Gelegenheit verletze ich PEP 8. Manchmal importiere ich Zeug in Funktionen. In der Regel mache ich das, wenn es einen Import gibt, der nur innerhalb einer einzigen Funktion verwendet wird.

Irgendwelche Meinungen?

BEARBEITEN (der Grund, warum ich Funktionen importiere, kann eine gute Idee sein):

Hauptgrund: Es kann den Code klarer machen.

  • Wenn ich mir den Code einer Funktion anschaue, frage ich mich vielleicht: "Was ist Funktion / Klasse xxx?" (xxx wird innerhalb der Funktion verwendet). Wenn ich alle meine Importe an der Spitze des Moduls habe, muss ich dorthin gehen, um festzustellen, was xxx ist. Dies ist eher ein Problem bei der Verwendung from m import xxx . Das Sehen von m.xxx in der Funktion sagt mir wahrscheinlich mehr. Abhängig davon, was m ist: Ist es ein bekanntes Top-Level-Modul / Paket ( import m )? Oder ist es ein Untermodul / Paket ( from abc import m )?
  • In einigen Fällen kann diese zusätzliche Information ("Was ist xxx?") In der Nähe von wo xxx verwendet wird, die Funktion leichter verständlich machen.



Hier sind die vier Anwendungsfälle, die wir verwenden

  1. import (und from x import y und import x as y ) an der Spitze

  2. Auswahlmöglichkeiten für den Import Oben.

    import settings
    if setting.something:
        import this as foo
    else:
        import that as foo
    
  3. Bedingter Import Wird mit JSON, XML-Bibliotheken und dergleichen verwendet. Oben.

    try:
        import this as foo
    except ImportError:
        import that as foo
    
  4. Dynamischer Import Bisher haben wir nur ein Beispiel dafür.

    import settings
    module_stuff = {}
    module= __import__( settings.some_module, module_stuff )
    x = module_stuff['x']
    

    Beachten Sie, dass dieser dynamische Import keinen Code einbringt, sondern komplexe Datenstrukturen in Python einbringt. Es ist wie ein eingelegtes Stück Daten, außer dass wir es von Hand gebeizt haben.

    Dies steht auch mehr oder weniger an der Spitze eines Moduls

Hier sind, was wir tun, um den Code klarer zu machen:

  • Halten Sie die Module kurz.

  • Wenn ich alle meine Importe an der Spitze des Moduls habe, muss ich dorthin gehen, um festzustellen, was ein Name ist. Wenn das Modul kurz ist, ist das einfach.

  • In einigen Fällen kann diese zusätzliche Information, die in der Nähe eines Namens liegt, die Funktion leichter verständlich machen. Wenn das Modul kurz ist, ist das einfach.




Ich habe diese Regel für Module, die sich selbst testen, schon einmal gebrochen. Das heißt, sie werden normalerweise nur für die Unterstützung verwendet, aber ich definiere eine Hauptfunktion für sie, so dass Sie ihre Funktionalität testen können, wenn Sie sie selbst ausführen. In diesem Fall importiere ich manchmal getopt und cmd nur in main, weil ich möchte, dass es jemandem klar ist, der den Code liest, dass diese Module nichts mit dem normalen Betrieb des Moduls zu tun haben und nur zum Testen einbezogen werden.




Aus der Frage nach dem zweimaligen Laden des Moduls - Warum nicht beides?

Ein Import am Anfang des Skripts zeigt die Abhängigkeiten an und ein weiterer Import in der Funktion macht diese Funktion atomarer, während sie scheinbar keinen Leistungsnachteil verursacht, da ein konsekutiver Import billig ist.




Related

python conventions