2016-05-30 7 views
0

Ich schreibe ein Python-Modul und ich habe eine Funktion, die eine neue Variable im Modul definiert. Ich möchte eine Variable festlegen, auf die in der Datei zugegriffen werden kann, die die Datei importiert. Wenn das verwirrend ist, hier ist mein Code:So bearbeiten Sie globale Variable im Modul?

# main.py 

import other_module 

other_module.set_variable("var1") 

print(other_module.var1) # This is not a NameError 

print(var1) # NameError 

Allerdings, wenn ich etwas tun leicht anders:

# main.py 

from other_module import * 

set_variable("var1") 

print(var1) # NameError 

print(other_module.var1) # NameError 

Und other_module.py:

#  other_module.py 

def set_variable(name): 
    exec(""" 
global %s 
%s = 5 
     """ % (name, name)) 

Ich habe keine Kontrolle über main.py. Das ist der Code des Verbrauchers. Ich möchte in der Lage sein, main.py 's globals zuzugreifen und zu ändern. Ich möchte, dass das funktioniert:

# main.py 

from other_module import * 

set_variable("var") 

print(var) # This should print 5 
+0

Diese Frage ist sehr ähnlich zu http://stackoverflow.com/questions/37534046 –

+0

Warum sind Sie exec statt nur 'Globals mit()'? – BrenBarn

+0

@BrenBarn Wie würde ich 'globals()' verwenden? 'globals(). append'? – NoOneIsHere

Antwort

1

Was Sie tun, klingt wie Klassenmethode Verhalten für mich. Eine Klasse wird sicherer zu verwenden als der globale Namespace, versuchen Sie eine Klasse?

Dies funktioniert:

# other.py 
class Other(object): 

    @classmethod 
    def set_variable(cls, name): 
     exec('Other.%s = 5' % name) 

# main.py 
from other import Other 

Other.set_variable('x') 
print Other.x 

# output 
% ./main.py 
5 
+0

Macht nichts, das funktioniert! Ich werde das akzeptieren. – NoOneIsHere