Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating global variable from submodule available in entire module

Tags:

python

module

Suppose I have three files inside a directory that is called mymod. The three files are __init__.py, sm1.py, sm2.py. The content of the modules are:

__init__.py

import sm1
import sm2
global _defaults

sm1.py

global _defaults
class get_defs:
    color='blue'
    number=10    
_defaults = get_defs()

sm2.py

def printdefs():
    print _defaults.color
    print _defaults.number

So, what I am trying to do is set a class inside submodule sm1 called _defaults that can be accessed from any other place in the module or submodules, so that submodule sm2 can also access and print that class. I thought this setting would work, but when I run

import mymod
mymod.sm2.printdefs()

I get this error:

NameError: global name '_defaults' is not defined

Any suggestions as how to do that (and why this isn't working?)

P.S.:

The reason I want a global variable instead of just setting some variable to be imported is that I want to be able for the user to do this:

>>> import mymod
>>> mymod.sm2.printdefs()
'blue'
10
>>> mymod._defaults.color='red'
>>> mymod.sm2.printdefs()
'red'
10

So, working with global variables is the only I thought I could work like this.

Thank you.

like image 322
TomCho Avatar asked Jun 19 '26 23:06

TomCho


1 Answers

global is not how you do that. sm1 should just set the variable, then all the other modules should just import it.

sm1.py:

class get_defs:
    color='blue'
    number=10 
_defaults = get_defs()

sm2.py

import sm1
def printdefs():
    print sm1._defaults.color
    print sm1._defaults.number

But really I'm not sure why you have a global for this rather than some kind of factory method, or class. If you can give more details about the actual project that would be helpful.

like image 194
Chad S. Avatar answered Jun 24 '26 20:06

Chad S.



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!