Accessing the outer scope in Python 2.6

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

Say, I have some scope with variables, and a function called in this scope wants to change some immutable variables:

def outer():
    s =  qwerty 
    n = 123
    modify()

def modify():
    s =  abcd 
    n = 456

Is it possible somehow to access the outer scope? Something like nonlocal variables from Py3k.

Sure I can do s,n = modify(s,n) in this case, but what if I need some generic injection which executes there and must be able to reassign to arbitrary variables?

I have performance in mind, so, if possible, eval & stack frame inspection is not welcome :)


  UPD   : It s impossible. Period. However, there are some options how to access variables in the outer scope:
    • Use globals. By the way, func.__globals__ is a mutable dictionary ;)
    • Store variables in a dict/class-instance/any other mutable container
    • Give variables as arguments & get them back as a tuple: a,b,c = innerfunc(a,b,c)
    • Inject other function s bytecode. This is possible with byteplay python module.

Answers

This is not how nonlocal works. It doesn t provide dynamic scoping (which is just a huge PITA waiting to happen and even more rarely useful than your average "evil" feature). It just fixes up lexical scoping.

Anyway, you can t do what you have in mind (and I would say that this is a good thing). There s not even a dirty but easy hack (and while we re at it: such hacks are not discouraged because they generally perform a bit worse!). Just forget about it and solve the real problem properly (you didn t name it, so we can t say anything on this).

The closest you could get is defining some object that carries everything you want to share and pass that around explicitly (e.g. make a class and use self, as suggested in another answer). But that s relatively cumbersome to do everywhere, and still hackery (albeit better than dynamic scoping, because "explicit is better than implicit").

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/4763965/accessing-the-outer-scope-in-python-2-6

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils