Indentation and grouping proposal

Michael P. Reilly arcege at shore.net
Tue Jun 8 17:57:22 CEST 1999


Emile van Sebille <emile at fenx.com> wrote:
: Re: One Liners:

:>>> def myexec(b):
: ...  for stmnt in string.split(b,'\n'):
: ...   exec(stmnt)
: ...
:>>> b="if a: print 'Spam!';print 'Spam2!';\nprint'Yum!'"
:>>> myexec(b)
: Yum!
:>>> a=1
:>>> myexec(b)
: Spam!
: Spam2!
: Yum!
:>>>

Unfortunately, this doesn't work in other namespaces and frames,  but
the following does.

$ cat fexec.py
def myexec(stmts):
  import string, sys
  try:
    raise SystemError
  except SystemError:
    tb = sys.exc_info()[-1]
  f = tb.tb_frame.f_back
  g, l = f.f_globals, f.f_locals
  del tb, f
  for stmt in string.splitfields(stmts, '\n'):
    exec stmt in g, l

$ cat foo.py
import fexec

def foo(x):
  fexec.myexec('print x')
foo(10)

$ python foo.py
10
$

The trick is to get locals and globals of myexec's caller (which could
be in another module).  But, do we know how safe this is? ;)

  -Arcege





More information about the Python-list mailing list