2014-04-09 13 views
5
pkg/ 
    __init__.py 
    foo.py 
    bar.py 
    baz.py 

Ich habe eine Reihe von Modulimporten, die in foo.py, bar.py und baz.py gleich sind.Importieren über ein Python-Paket

Gibt es eine Möglichkeit, die Importe in __init__.py zu tun? Was müsste ich in foo.py schreiben?

Antwort

1

Die Importe in __init__.py zu platzieren wäre eine schlechte Idee; __init__.py wird als Inhalt Ihres Modulobjekts verwendet, daher handelt es sich um eine öffentliche Schnittstelle. Außerdem wird __init_.py importiert, wenn Ihr Paket importiert wird, während Sie die Importe nicht wirklich benötigen, bis Ihre Submodule sie benötigen.

Der beste Ansatz besteht darin, gemeinsamen Code in ein internes Detailmodul zu setzen, das mit einem einzelnen anfänglichen Unterstrich ("privat") markiert ist, z. _imports.py, dann in Ihre anderen Dateien schreiben Sie from ._imports import *.

1

Sie haben den richtigen Weg, dies zu tun, aber ich kann dies ein wenig formeller machen und geben (hoffentlich) eine klarere Erklärung als die, die Sie an anderer Stelle gefunden. Wenn Sie Importe modularisieren möchten, was abhängig von Ihrer Codierphilosophie an sich eine gute oder schlechte Idee sein kann (Transparenz vs. Wiederverwendung von Code), können Sie Ihre Importe aus einem anderen Skript importieren, unabhängig davon, ob die Importe in __init__.py erfolgen. Zum Beispiel:

"""import_scripts.py""" 
import numpy as np 
import scipy as sp 
... 

"""actual_code.py""" 
from import_scripts import * 
# np and sp are now in scope 

von __init__.py zu importieren ist meist die gleiche, die Sie verwenden nur traditionell einen relativen Import statt, wenn Sie es aus dem gleichen Modul sind erreichbar:

# To import form __init__ 
from . import * 

So wichtig zu beachten, dass Diese Art von Importen funktioniert nur, wenn Sie diese Python-Skripte explizit als Module und nicht als Skripte ausführen. Das bedeutet:

python -m foo 

statt

python foo.py 

wichtig, aber feinen Unterschied.

Hoffe, dass hilft. Lass es mich wissen, wenn du weitere Fragen hast.

+0

+1 Danke für die subtile Unterscheidung! – ksindi

Verwandte Themen