Globals or objects?

tinnews at isbd.co.uk tinnews at isbd.co.uk
Fri Feb 22 07:01:20 EST 2008


Steven D'Aprano <steve at remove-this-cybersource.com.au> wrote:
> >> >.... but you do keep having to use a longer reference to the value so
> >> >what have you won?
> >> 
> >> Clarity, simplicity, robustness
> > 
> > Clarity - why is it clearer?
> 
> Consider two function calls:
> 
> 
> x = ham(arg, counter)
> y = spam(arg)
> 
> Both do exactly the same thing: ham() takes an explicit "counter" 
> argument, while spam() uses a global variable. Which one makes it clear 
> that it uses a counter, and which does not?
> 
But you're not comparing what the OP posted.  He was comparing a
global with an object with a single variable inside it.  Either would
work with the y = spam(arg) example above.

I agree absolutely about the reason for not using globals but that
applies similarly to objects.  The OP was comparing a global integer
variable with an object with a single integer variable in it.

>  
> > Simplicity - no, you've added an extra layer.
> 
> Consider trying to run ham() and spam() twice, independently:
> 
> x1 = ham(arg, counter)
> x2 = ham(arg, another_counter)
> 
> y1 = spam(arg)
> saved_counter = counter  # save the global variable
> counter = 0  # reset it to zero
> y2 = spam(arg)
> another_counter = counter
> counter = saved_counter
> 
> Which is simpler?

Again it's not what the OP was doing.  I again agree absolutely that
in general globals are a 'bad thing' if you can avoid them but your
example doesn't really affect the original OP question.

> 
> 
>  
> > Robustness - how?
> 
> If you avoid the use of globals, this code will work as expected:
> 
> x = ham(arg, counter)
> assert counter.n = 5  # or whatever value ham() sets it to...
> function()
> another_function()
> yet_another_function()
> 
> At the end of this block of function calls, you can be confident that 
> counter still has the same value.
> 
> Now consider using globals:
> 
> x = spam(arg)
> assert counter = 5  # or whatever value spam() sets it to...
> function()
> another_function()
> yet_another_function()
> 
> What value will counter have? The only way to tell is to carefully read 
> through function(), another_function() and yet_another_function() and see 
> whether or not they modify the global counter. Maybe they do, maybe they 
> don't, who can tell?
> 
You're just telling me all the problems one can have with globals
which I know and agree with.  But an object with a single variable in
it has exactly the same issues.

-- 
Chris Green



More information about the Python-list mailing list