views:

1187

answers:

4

Hi,

I'm new to python, so please excuse what is probably a pretty dumb question.

Basically, I have a single global variable, called _debug, which is used to determine whether or not the script should output debugging information. My problem is, I can't set it in a different python script than the one that uses it.

I have two scripts:

one.py:
-------

def my_function():
  if _debug:
    print "debugging!"


two.py:
-------

from one import *
_debug = False

my_function()

Running two.py generates an error:

NameError: global name '_debug' is not defined

Can anyone tell me what I'm doing wrong?

Thanks,

Ben

+4  A: 

Names beginning with an underscore aren't imported with

from one import *
kgiannakakis
And it is because they mean "this is internal stuff, do not touch it, or do so at your own risk".
Bartosz Radaczyński
I'm actually shocked that a completely incorrect answer has been accepted and voted up so highly.
Alabaster Codify
Well it's not completely incorrect; kgiannakakis is correct about names beginning with underscores not being imported. However, you're correct that this still isn't why his example code doesn't work. Your answer is much better.
Eli Courtwright
yeah, that does not solve the issue
nosklo
+4  A: 

You can also use the __debug__ variable for debugging. It is true if the interpreter wasn't started with the -O option. The assert statement might be helpful, too.

unbeknown
+12  A: 

There are more problems than just the leading underscore I'm afraid.

When you call my_function(), it still won't have your debug variable in its namespace, unless you import it from two.py.

Of course, doing that means you'll end up with cyclic dependencies (one.py -> two.py -> one.py), and you'll get NameErrors unless you refactor where various things are imported and declared.

One solution would be to create a simple third module which defines 'constants' like this, which can be safely imported from anywhere, e.g.:

constants.py
------------
debug = True

one.py
------
from constants import debug
#...

two.py
------
from constants import debug
#...

However, I would recommend just using the built in logging module for this - why not? It's easy to configure, simpler to use, reliable, flexible and extensible.

Alabaster Codify
Yes, the logging module is the way to go here.
unbeknown
+1  A: 

A bit more explanation: The function my_function's namespace is always in the module one. This means that when the name _debug is not found in my_function, it looks in one, not the namespace from which the function is called. Alabaster's answer provides a good solution.

Paul Fisher