James Stroud wrote:
py> class mytuple(tuple):
  def magic(self, astr):
    names = astr.split()
    for name, val in zip(names, self):
      globals()[name] = val
...
py> t = mytuple((1,2,3))
py> t.magic('a b')
py> a
1
py> b
2

James


In case its not obvious:

def f():
  return mytuple((1,2,3))

f().magic('a b')

You can parameterize lobbing off values, or use more magic:

py> class mytuple(tuple):
...   def magic(self, astr):
...     names = astr.split()
...     for name, val in zip(names, self):
...       globals()[name] = val
...   def __add__(self, other):
...     if isinstance(other, tuple):
...       return mytuple(tuple.__add__(self, other))
...     else:
...       return mytuple(self[other:])
...
py> t = mytuple((1,2,3))
py> t + 1
(2, 3)
py> def f():
  return mytuple((1,2,3))
...
py> (f() + 1).magic('a b')
py> a
2
py> b
3

It's not as bad as a lot of the cynics are about to tell you it is. If it has any badness at all, it's because of the need (according to what I infer from your specification) to use the global namespace. If you want to modify a "more local" namespace, you can use some stack frame inspection to do some real magic:

py> import inspect
py> class mytuple(tuple):
  def magic(self, astr):
    names = astr.split()
    for name, val in zip(names, self):
      inspect.stack()[1][0].f_locals[name] = val
  def __add__(self, other):
    if isinstance(other, tuple):
      return mytuple(tuple.__add__(self, other))
    else:
      return mytuple(self[other:])
...
py> def f():
  return mytuple((6,7,8))
...
py> (f() + 1).magic('a b')
py> a
7
py> b
8

James
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to