Trevor Burnham
Trevor Burnham

Reputation: 77416

Overwrite global var in one line in Python?

I know that I can write:

foo = 'bar'
def update_foo():
  global foo
  foo = 'baz'

But do I really need two lines of code there? Python, alas, won't allow me to say

global foo = 'baz'

I could also mash the two lines together with the unfortunately repetitive

global foo; foo = 'baz'

Any other shortcuts? I'm on Python 2.6.5, but I'd be curious to hear responses for Python 3 as well.

Upvotes: 22

Views: 26365

Answers (5)

John La Rooy
John La Rooy

Reputation: 304137

def update_foo():
    globals().update(foo='baz')

Upvotes: 5

Alex Martelli
Alex Martelli

Reputation: 881575

You could use my favorite alternative to global (a pretty idiosyncratic taste...):

import sys
thismodule = sys.modules[__name__]
thismodule.foo = 'bar'

def update_foo():
  thismodule.foo = 'baz'

Once you've made the thismodule reference, you don't need to use global in this module, because you're always working with qualified names rather than bare names (a much better idea IMHO... but maybe in MHO only, I've not been able to convince Guido to supply thismodule [[or some other identifier with this functionality]] back when Python 3 was gestating).

Note that the first assignment to foo, at global level, can be done either with this explicit syntax, or by assigning to barename foo as you do in your code (I guess it's not surprising that my preference goes to the explicit form, though, in this case, just barely).

Upvotes: 25

Evan Plaice
Evan Plaice

Reputation: 14140

If it makes you feel better to put it all on one line...

global foo; foo = 'baz'

Upvotes: 2

mikej
mikej

Reputation: 66263

You could write it like this using the globals() dictionary:

def update_foo():
  globals()['foo'] = 'baz'

but I would just stick with the 2 lines or the separating with a ; approach.

Upvotes: 8

Ian Bicking
Ian Bicking

Reputation: 9922

It's two statements, there aren't any other forms.

Upvotes: 7

Related Questions