[Tutor] Confused about globals
Hi I have a series of python programs that plot stuff using PYX. Common to these is the need to read in a list of (well) locations in (X,Y) coords so I put that code in a separate module called shared_funcs.py. The coords are stored in dictionaries which I want to use later in the main program - every time I find a well with data, I can get the well's (x,y) coords by looking up the well name in the dictionary. The code snippet looks like this: === main.py # define coord dictionaries for global use DE={} DN={} import shared_funcs() shared_funcs.get_xy_data() # Get coords from file ... do plotting stuff === shared_funcs.py === def get_xy_data(): in_file=open(well_xy.txt,r) for line in in_file L=line.split() well=L[0] x=L[1] y=L[2] DE[well]=x DN[well]=y in_file.close() The problem is that DE and DN appear not to be accessible to get_xy_data - presumably this is because shared_funcs.py and main.py don't share the same scope. So, is there any way to let get_xy_data change DE and DN? I guess the obvious way is to pass them to get_xy_data as arguments - but is there a more pythonic method? Thanks in advance! ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Confused about globals
As a note, the import should be import shared_funcs In Python, most globals aren't really global -- they're local to the module. If you split your modules by functionality, then variables should naturally relate to a specific module, and be located there. So, for example, you could move those global variables to shared_funcs.py, renamed to wells.py: === wells.py == DE={} DN={} def get_xy_data(): in_file=open(well_xy.txt,r) for line in in_file L=line.split() well=L[0] x=L[1] y=L[2] DE[well]=x DN[well]=y in_file.close() def lookup_well(well): return (DE.get(well, None), DN.get(well, None)) === main.py === import wells def func_that_needs_wells(): ... for e n wells.DE.keys(): ... ... etc. On Jun 9, 2006, at 4:42 AM, Etrade Griffiths wrote: Hi I have a series of python programs that plot stuff using PYX. Common to these is the need to read in a list of (well) locations in (X,Y) coords so I put that code in a separate module called shared_funcs.py. The coords are stored in dictionaries which I want to use later in the main program - every time I find a well with data, I can get the well's (x,y) coords by looking up the well name in the dictionary. The code snippet looks like this: === main.py # define coord dictionaries for global use DE={} DN={} import shared_funcs() shared_funcs.get_xy_data() # Get coords from file ... do plotting stuff === shared_funcs.py === def get_xy_data(): in_file=open(well_xy.txt,r) for line in in_file L=line.split() well=L[0] x=L[1] y=L[2] DE[well]=x DN[well]=y in_file.close() The problem is that DE and DN appear not to be accessible to get_xy_data - presumably this is because shared_funcs.py and main.py don't share the same scope. So, is there any way to let get_xy_data change DE and DN? I guess the obvious way is to pass them to get_xy_data as arguments - but is there a more pythonic method? Thanks in advance! ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] Confused about globals
Etrade Griffiths wrote: Hi I have a series of python programs that plot stuff using PYX. Common to these is the need to read in a list of (well) locations in (X,Y) coords so I put that code in a separate module called shared_funcs.py. The coords are stored in dictionaries which I want to use later in the main program - every time I find a well with data, I can get the well's (x,y) coords by looking up the well name in the dictionary. You don't need a global variable in shared_funcs.get_xy_data() at all. It is reading a file and creating two dicts. I would write it to create and return the dicts. Then you can save them where you like in the caller. Also, I would use one dict whose values are (x, y) pairs, rather than two parallel dicts. Then your code looks like this: === shared_funcs.py === def get_xy_data(): D = {} in_file=open(well_xy.txt,r) for line in in_file L=line.split() well=L[0] x=L[1] y=L[2] D[well]=(x, y) in_file.close() return D === main.py === import shared_funcs D = shared_funcs.get_xy_data() though I suggest a more descriptive name than D... If there are other related bits of data or operations other than lookup, that might point to using a class to wrap the dict, the other data and operations. Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor