Tuple assignment and generators?
Diez B. Roggisch
deets at nospam.web.de
Thu May 4 18:00:15 CEST 2006
Tim Chase wrote:
> Just as a pedantic exercise to try and understand Python a
> bit better, I decided to try to make a generator or class
> that would allow me to unpack an arbitrary number of
> calculatible values. In this case, just zeros (though I
> just to prove whatever ends up working, having a counting
> generator would be nice). The target syntax would be
> something like
<snip/>
By using this:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/284742
I came up with a small decorator doing that:
import inspect, dis
def expecting():
"""Return how many values the caller is expecting"""
f = inspect.currentframe()
f = f.f_back.f_back
c = f.f_code
i = f.f_lasti
bytecode = c.co_code
instruction = ord(bytecode[i+3])
if instruction == dis.opmap['UNPACK_SEQUENCE']:
howmany = ord(bytecode[i+4])
return howmany
elif instruction == dis.opmap['POP_TOP']:
return 0
return 1
def variably_unpack(f):
def d(*args, **kwargs):
r = f(*args, **kwargs)
exp = expecting()
if exp < 2:
return exp
return (r.next() for i in xrange(exp))
return d
@variably_unpack
def test():
def gen():
i = 0
while True:
yield i
i += 1
return gen()
a, b, c = test()
print a,b,c
a, b, c, d = test()
print a,b,c, d
Diez
More information about the Python-list
mailing list