2017-11-16 4 views
1

Ich habe ein Programm, das aus mehreren Modulen besteht, die die jeweiligen Web-Application-Handler spezifizieren, und eins, das den jeweiligen Router spezifiziert.
Die Bibliothek, die ich verwende, kann here gefunden werden.Load-Modul zum Aufruf seiner Dekoratoren

Auszug aus webapp.service (es gibt mehr solcher Module):

from webapp.router import ROUTER 

@ROUTER.route('/service/[id:int]') 
class ServicePermissions(AuthenticatedService): 
    """Handles service permissions.""" 

    NODE = 'services' 
    NAME = 'services manager' 
    DESCRIPTION = 'Manages services permissions' 
    PROMOTE = False 

webapp.router:

ROUTER = Router() 

Wenn ich importieren Sie die webapp.router Modul, das webapp.service Modul offensichtlich nicht ausgeführt werden. Daher wird der @ROUTER.route('/service/[id:int]') Decorator nicht ausgeführt und meine Webanwendung schlägt mit der Nachricht fehl, dass die entsprechende Route nicht verfügbar ist.

Was ist die beste Vorgehensweise in diesem Fall, den Code in webapp.service auszuführen, um die Dekorateure zu "laufen"? Ich muss das Modul selbst oder eines seiner Mitglieder nicht wirklich importieren.

+1

Ja, Sie * bis * das Modul selbst importieren müssen wirklich. Nur so kann der Code ausgeführt werden. –

+0

_ "Wenn ich das webapp.router-Modul importiere, wird das webapp.service-Modul offensichtlich nicht ausgeführt." _ Was? Wie ist das offensichtlich? Wenn Sie ein Modul importieren, wird der Code nicht mehr ausgeführt? Warum sollte das jemals der Fall sein? Ich verstehe das Problem überhaupt nicht. –

+0

@DanielRoseman Aber dann wird sich jeder Linter über ungenutzte Importe beschweren. Gibt es einen eleganteren Weg? –

Antwort

1

Wie in den Kommentaren zur Frage angegeben, müssen Sie nur die Module importieren. Was die Beschwerden angeht, sind das die kleineren Ihrer Probleme. Linters sind da, um zu helfen - wenn sie in den Weg kommen, hören Sie einfach nicht auf sie.

Also, der einfache Weg, nur um Ihre Sachen zum Laufen zu bringen, ist am Ende Ihrer __main__.py oder __init__.py, abhängig von Ihrer App-Struktur, explizit alle Module zu importieren, die den View Decorator verwenden.

Wenn Sie einen Linter haben, prüfen Sie, wie er auf den Importleitungen stummgeschaltet wird - dies wird normalerweise mit einem speziellen Kommentar in der Importzeile bewerkstelligt. Die Python-Introspektion ist fantastisch, aber sie kann keine Instanzen einer Klasse oder Unterklassen finden, wenn diese in Modulen definiert sind, die nicht importiert werden: Ein solches Modul ist nur eine Textdatei, die wie alle Daten auf der Platte sitzt Datei.

Was einige Frameworks als Ansatz bieten, ist ein "Discovery" -Dienstprogramm, das automatisch alle "py" -Dateien in die Projektordner importiert. So können Ihre Ansichten ohne explizite Importe "entstehen".

Sie könnten eine Funktion wie verwenden:

import os 

def discover(caller_file): 
    caller_folder = os.path.dirname(caller_file) 
    for current, folders, files in os.walk(caller_folder): 
     if current == "__pycache__": 
      continue 
     for file in files: 
      if file.endswith(".py"): 
       __import__(os.path.join(current, file)) 

und auf Ihrem Hauptmodul rufen mit discover(__file__)

Verwandte Themen