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

Chris Rebert clp at rebertia.com
Tue Nov 18 20:11:44 EST 2008


On Tue, Nov 18, 2008 at 4:14 PM, r0g <aioe.org at technicalbloke.com> wrote:
> Hi There,
>
> 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
>
>
>
> 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.

A `global` declaration at the module-level, while syntactically valid,
doesn't do anything. It only really makes sense to use `global` in
function bodies.
And as Gabriel explained, Python has no program-wide global scope.
Global scope is always module-specific.

Cheers,
Chris
-- 
Follow the path of the Iguana...
http://rebertia.com

>
> How can get my classes to see this 'dirty_global' variable again?
>
> Thanks,
>
> Roger.
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list