2017-12-27 6 views
0

Gibt es eine Möglichkeit, alle Module innerhalb eines Pakets von der Hauptanwendung auf Root-Ebene zu importieren und Funktionen innerhalb der Module sofort verfügbar in Python 3? Hier ist ein Beispiel Dateibaum:Wie mache ich Funktionen von einem Paket-Modul sofort zur Root-Anwendung in Python3

+app 
    |- __init__.py 
    |- main.py 
    |+ package 
    |- __init__.py 
    |- module.py #(contains function1, function2 and function 3) 

Ich möchte folgende Import-Anweisung innerhalb des main.py vermeiden (es kann für komplexe Anwendungen lange und schlampig):

from package.module import function1, function2, function3 

Das ist schön , weil ich dann function1() von main.py anrufen kann. Das Importieren einer Funktion aus dem package.module allein bedeutet, dass ich dann das vollständige Verzeichnis der Funktion aufrufen muss, um es in meinem Skript zu verwenden (oder innerhalb einer neuen Funktion zu aliasieren). Zum Beispiel:

import package.module 

package.module.function(param)#not fun...too long! 

#or like this 
def newFunction(param): 
    '''why create a new function to handle an already existing one? 
     Bad form and non Pythonic''' 
    return package.module.function(param) 

Wenn ich __all__ = ["module1", "module2"] im __init__.py meiner Paket enthalten, das heißt, ich muss folgendes tun:

from package import * #it is said this is bad form as well 

module.function(param) 
#I just want the function and don't want to call module also 

Mein Ziel ist es, das Paket und Modul zu importieren und dann voll haben Verwendung aller Funktionen innerhalb des Moduls, ohne das Paket und das Modul jedes Mal explizit aufrufen zu müssen, wenn ich die Funktion verwenden möchte. Denken Sie etwas in Richtung:

import package.module 

function1(x) 

Ich habe die documentation for Python 3 about modules and packages gelesen. Gedanken/Hilfe werden geschätzt.

Antwort

1

Der beste Kompromiss scheint bei der Einfuhr zu benennen:

import package.module as mod 

mod.function(param) 

Typing drei Buchstaben kurz genug sein sollte. Gleichzeitig ist der Import qualifiziert und belastet Ihren globalen Namensraum nicht als * Import. Sie können einen beliebigen Namen für mod verwenden. Selbst ein einbuchstabiger Name würde funktionieren. Es wird jedoch empfohlen, mindestens drei Buchstaben in einem Namen zu haben.

+0

Das ist in der Tat logisch @ MikeMüller, aber wenn ich viele Funktionen aus Modulen und Paketen importieren, können die Importanweisungen exponentiell wachsen. Ich nehme an, dass es möglich wäre, ein Importskript zu erstellen, um alle Funktionsimporte zu verarbeiten und dann einfach das aus der Hauptanwendung aufzurufen, obwohl ich es noch nie versucht habe. Wie werden extrem große Anwendungen gehandhabt, wenn 50+ Importe möglich sind? – Fergus

+0

Sie müssen importieren, was Sie brauchen. Sie brauchen immer noch die gleiche Menge an Importanweisungen, egal ob Sie das '*' oder meine Methode verwenden. –

+0

Danke nochmal @MikeMüller. Wie würde ich eine Datei erstellen, die alle meine Importe enthält und dann einfach das aus der Anwendung '__main __. Py' aufrufen? Es scheint, als ob das den Importprozess in der Haupt-App aufräumen würde. – Fergus

Verwandte Themen