Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing the outer scope in Python 2.6

Tags:

python

scope

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:

  1. Use globals. By the way, func.__globals__ is a mutable dictionary ;)
  2. Store variables in a dict/class-instance/any other mutable container
  3. Give variables as arguments & get them back as a tuple: a,b,c = innerfunc(a,b,c)
  4. Inject other function's bytecode. This is possible with byteplay python module.
like image 546
kolypto Avatar asked Jan 21 '11 21:01

kolypto


2 Answers

Define the variables outside of the functions and use the global keyword.

s, n = "", 0

def outer():
    global n, s
    n = 123
    s = 'qwerty'
    modify()

def modify():
    global n, s
    s = 'abcd'
    n = 456
like image 162
orlp Avatar answered Sep 28 '22 00:09

orlp


Sometimes I run across code like this. A nested function modifies a mutable object instead of assigning to a nonlocal:

def outer():
    s = [4]
    def inner():
        s[0] = 5
    inner()
like image 23
joeforker Avatar answered Sep 28 '22 00:09

joeforker