How to deal with globals during refactoring classes into separate files.

Gabriel Genellina gagsl-py2 at yahoo.com.ar
Tue Nov 18 19:52:02 EST 2008


En Tue, 18 Nov 2008 22:14:39 -0200, r0g <aioe.org at technicalbloke.com>  
escribió:

> I'm refactoring some old code that uses global variables and was
> originally written in one big flat file with a view to nicening it up
> and then extending it. The problem I have though is when I move the
> various classes out to their own separate files and reimport them back
> in they can't see the globals in the main program. Most of the globals
> were just constants and so I have been able to factor them out but
> there's one that's kind of pivotal that I still need, basically a list
> of all the threads I have running, I don't see how I could get rid of
> that. Example follows...
>
> The original with global variable and classes all in one file...
>
> dirty_global = "whatever"
> class example():
>   def print_message(self):
>     print "Sure, "+dirty_global
> a = example()
> a.print_message()
>
>>>> Sure, whatever
>
>
> But when I put the class in  its own file and then import it back in...
>
>
> from example_class import example
> dirty_global = "whatever"
> a = example()
> a.p()
>
>>>> NameError: global name 'dirty_global' is not defined

When example() runs, it sees the globals of the module in which it was  
defined. That is, if you print globals() inside the example() function,  
you'll see the globals defined in example_class, not the globals in the  
main module.

> I had thought declaring the variable using the global keyword at the top
> of the file might make it a global 'proper' (as per the manual) or that
> using it at the top of the class file might somehow allow the class to
> see the variable in file it was called from but clearly my understanding
> of python namespaces and scoping isn't quite there yet as neither of
> these seem to make any difference.
>
> How can get my classes to see this 'dirty_global' variable again?

Put it on another module and import the module wherever you need access to  
it.
"global" in Python means "global to the containing module".

-- 
Gabriel Genellina




More information about the Python-list mailing list