2017-05-08 7 views
-1

ich zwei globale Variablen in meiner Python-Modul hava: load.py:Python Import globale Variablen, sondern ruft Funktionen

a = load_a() 
b = load_b() 

ich in meiner Test-Datei importiert werden soll: test.py:

from load import a 

Allerdings fand ich, dass b auch genannt wird, ist load_b() auch und load_b() kann viel Zeit kosten so ist meine Frage gestellt, wie kann ich laden nur ein, aber nichtnennenFunktion

+0

Haben Sie eine leere '__init__.py' Datei in diesem Verzeichnis? – Exprator

+0

Ja, ich möchte nur eine laden, aber nicht b, aber b interpretiert auch und load_b() -Funktion genannt –

+0

Dies ist alles normale Python-Code, der normale Variablen definiert. Was, wenn Sie nur "b" importieren wollten, würden Sie "Import" über die Zeile "a = ..." überspringen? So funktioniert es nicht ... – deceze

Antwort

0

import führt das Modul immer von oben nach unten aus. einen bestimmten Variablennamen Laden nicht möglich ist, das Modul vollständig ohne Ausführung:

from load import a 

die äquivalent ist:

# test.py 
import load 
a = load.a 

Sie können nicht nur Teil eines Moduls zu laden, gibt es viele rationalen für Dieses Verhalten. Zum Beispiel können Sie Ihre load_a Funktion globale Variablen nach oder vor load_a Funktion definiert verwenden:

def load_a(arg): 
    if arg in table: 
     # do something here... 

table = [1,2,3,4] 

load_a kann möglicherweise auch globale Variablen ändern.

Der eingebaute __module__ Name für Funktionsobjekte mit dem Modul verbunden ist, in dem die Funktion tatsächlich definiert ist, auch wenn Sie from ... import ... Anweisung:

>>> from load import a_load 
>>> a_load.__module__ 
'load' 

Jedoch können Sie testen, Fahnen, den Anruf zu load_b verhindern oder Sie sogar @ Dekorateure benutzen könnte, gibt es viele Abhilfen für diesen Fall natürlich:

if flag_b 
    b = load_b() 
+0

Der Ratschlag zur Problemumgehung am Ende ist nicht wirklich etwas, was Sie jemals tun sollten, Sie sollten Ihre Modulstruktur lieber überdenken. Der Rest der Antwort ist aber toll. – deceze

+0

@deceze Ich stimme zu, besonders wenn Sie Hunderte von solchen Anrufen haben, werden Sie Ihren Code mit solchen Flags verunreinigen. Es dient dem Zweck für eine einfache Aufgabe, aber nicht sehr elegant. * Nimm es nicht als einen Ratschlag, nur eine vereinfachte Problemumgehung ;-) – direprobs

+0

also, wie kann ich den Code umstrukturieren, um es zu vermeiden? –

0

Sie sollten Ihr Design überdenken. Wenn das importierende Modul eine Initialisierung durchführen möchte, sollte es dies tun müssen. Das importierte Modul sollte nur die Werkzeuge zur Verfügung stellen:

import load 
a = load.load_a() 

Auf diese Weise Ihr Modul weniger unbeabsichtigte Nebenwirkungen haben wird und mehr prüfbar sein.

Verwandte Themen