2016-04-22 9 views
0

So bin ich ziemlich tief in die Erstellung eines benutzerdefinierten Job/Prozess benutzerdefinierte Manager-Modul, und wenn ich zu integrieren es kam ich eine Interaktion, die ich noch nicht mit Modulen und Namespaces gesehen hatte .importiert modulemodule Namespaces interferieren miteinander

-Code spricht besser als Worte:

So gibt es zwei leicht unterschiedliche Skripte:

test1:

import jobManager 

jobManager.jobMap = {'test1':'test123'} 

UND test2:

import jobManager 

jobManager.jobMap = {'test2':'test222'} 

Top Level Script:

So
import test1 
import test2 

print(test1.jobManager.jobMap) 
print(test2.jobManager.jobMap) 

, wenn ich die Top-Level-Skript ausführen, druckt:

{'test2':'test222'} 
{'test2':'test222'} 

Aber meine erwartete Ausgabe ist:

{'test1':'test123'} 
{'test2':'test222'} 

Ist das nur ein Fall, in dem test1.jobManager und test2.jobManager sind eigentlich der gleiche Namensraum? Gibt es eine Möglichkeit, sie getrennt zu halten?

Antwort

1

Ist dies nur ein Fall, in dem test1.jobManager und test2.jobManager tatsächlich den gleichen Namespace sind?

Ja.

Gibt es eine Möglichkeit, sie getrennt zu halten?

Nicht ohne ein anderes Modul zu erstellen.

+0

Eine Umgehung wäre es also, alles in einer Klasse zu verpacken und in jedem der relevanten Module zu initialisieren? Oder gibt es einen anderen Weg? – user3593486

+0

Ich bin überrascht, dass es etwas ist, das ich noch nie zuvor gesehen habe, ist es nur ein Fall, wo die Verwendung globaler Variablen unordentlich werden kann? Oder gibt es andere Grubenstürze, auf die ich achten sollte? – user3593486

+0

Wenn Sie mehrere unabhängige Instanzen von Verhalten dann eine Klasse ist der Weg zu gehen. Der andere Nachteil, auf den Sie achten sollten, ist, wenn ein Modul auf mehrere Arten über 'sys.path' gefunden werden kann; Es ist möglich, dasselbe Modul auf mehrere verschiedene Arten zu importieren, * aber dies ist ein entartetes Verhalten und sollte nicht dazu verwendet werden, das obige Problem "zu lösen". –