variable - Ist es pythonisch, innerhalb von Funktionen zu importieren?




python variable name convention (5)

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.

https://code.i-harness.com

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.

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.


Es gibt zwei Fälle, in denen ich PEP 8 in dieser Hinsicht verletze:

  • Zirkuläre Importe: Modul A importiert Modul B, aber etwas in Modul B benötigt Modul A (obwohl dies oft ein Zeichen dafür ist, dass ich die Module umgestalten muss, um die zirkuläre Abhängigkeit zu beseitigen)
  • Einfügen eines pdb-Haltepunkts: import pdb; pdb.set_trace() import pdb; pdb.set_trace() Dies ist praktisch b / c Ich möchte nicht import pdb an der Spitze jedes Moduls, das ich möglicherweise debuggen möchte, und es ist leicht zu erinnern, den Import zu entfernen, wenn ich den Haltepunkt entfernen.

Außerhalb dieser beiden Fälle ist es eine gute Idee, alles an die Spitze zu stellen. Es macht die Abhängigkeiten klarer.


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.


Solange es import und nicht from x import * , sollten Sie sie an die Spitze legen. Es fügt dem globalen Namespace nur einen Namen hinzu, und Sie bleiben bei PEP 8. Und wenn Sie es später woanders brauchen, müssen Sie nichts mehr bewegen.

Es ist keine große Sache, aber da es fast keinen Unterschied gibt, würde ich vorschlagen, was PEP 8 sagt.





conventions