[Tutor] Funtions, modules & global variables

Dave Angel d at davea.name
Mon Sep 26 01:58:07 CEST 2011


On 09/25/2011 07:21 PM, questions anon wrote:
> Hi All,
> I am trying to move from writing one long script each time I need to do a
> new thing but I do not quite understand how functions work, even after
> reading many manuals.
> My first attempt is to create a python file where I have defined a number of
> functions that get data in various ways.
> I have also made another python file where I want to plot the data in
> different ways. but I am having trouble getting that data to run in my
> python plotting file.
> I have made the variable I require 'global' but that doesn't seem to be
> working. I keep receiving:
> *
> UnboundLocalError: local variable 'TSFC' referenced before assignment*
>
> Below is a some of the script for both folder, just note that their will be
> many functions in each folder
> Any help will be greatly appreciated!!!
>
> #selectdata.py
> def selectalldata():
>          for (path, dirs, files) in os.walk(MainFolder):
>              for dir in dirs:
>                  print dir
>              path=path+'/'
>              for ncfile in files:
>                  if ncfile[-3:]=='.nc':
>                      print "dealing with ncfiles:", path+ncfile
>                      ncfile=os.path.join(path,ncfile)
>                      ncfile=Dataset(ncfile, 'r+', 'NETCDF4')
>                      global TSFC
>                      TSFC=ncfile.variables['T_SFC'][:,:,:]
>                      LAT=ncfile.variables['latitude'][:]
>                      LON=ncfile.variables['longitude'][:]
>                      TIME=ncfile.variables['time'][:]
>                      fillvalue=ncfile.variables['T_SFC']._FillValue
>                      ncfile.close()
>
>
> #plotdata.py
>
> from selectdata import selectalldata
> selectalldata()
>
> def plotncfilewithtime():
>      for TSFC, TIME in zip((TSFC[1::3]),(TIME[1::3])):
>      #convert time from numbers to date and prepare it to have no symbols for
> saving to filename
>          cdftime=utime('seconds since 1970-01-01 00:00:00')
>          ncfiletime=cdftime.num2date(TIME)
>          print ncfiletime
>          timestr=str(ncfiletime)
>          d = datetime.strptime(timestr, '%Y-%m-%d %H:%M:%S')
>          date_string = d.strftime('%Y%m%d_%H%M')
>          map = Basemap(projection='merc',llcrnrlat=-40,urcrnrlat=-33,
>
> llcrnrlon=139.0,urcrnrlon=151.0,lat_ts=0,resolution='i')
>
>         x,y=map(*N.meshgrid(LON,LAT))
>          map.drawcoastlines(linewidth=0.5)
>          map.readshapefile(shapefile1, 'DSE_REGIONS')
>          map.drawstates()
>
>          plt.title('Surface temperature at %s UTC'%ncfiletime)
>          ticks=[-5,0,5,10,15,20,25,30,35,40,45,50]
>          CS = map.contourf(x,y,TSFC, ticks, cmap=plt.cm.jet)
>          l,b,w,h =0.1,0.1,0.8,0.8
>          cax = plt.axes([l+w+0.025, b, 0.025, h], )
>          cbar=plt.colorbar(CS, cax=cax, drawedges=True)
>
>          plt.savefig((os.path.join(outputfolder,
> 'TSFC'+date_string+'UTC.png')))
>          plt.close() # must use plt.close() so that colorbar works!
>
>      print "end of processing"
> plotncfilewithtime()
>
1) If you're just learning how to split a long top-level script into 
functions, don't confuse the issues by also trying multiple source 
files, and especially multiple folders of source files.  Learn one 
concept before starting on the other.

2) when you mention an error message, give the whole thing, including 
stack trace.  or one thing, that'd mean we could see which line actually 
got the error.

3) if a function doesn't take any arguments and doesn't return any 
values, you're probably wasting your time.  Separate functions that only 
share by global variables aren't much better than top-level code.

4) When you declare a global in a function, please do it at the 
beginning of the function, right after the docstring.

5) Use all caps for constants, not for ordinary varables.  It's just a 
convention, but it'll make the code easier for others to read.

6) That particular error means that a variable in a function, WITHOUT a 
global statement, has been used as an rvalue, without first having been 
given a value.   The most common cause for that is that the assignment 
occurs inside a conditional, but you get the error when that particular 
branch doesn't happen.

Since your present code is in multiple files, I'll also point out:   
global means global to the one module, not global to the whole program.



-- 

DaveA



More information about the Tutor mailing list