def a((b,c,d),e):

Bengt Richter bokr at oz.net
Tue Apr 19 18:31:37 EDT 2005


On 19 Apr 2005 01:10:11 -0700, "George Sakkis" <gsakkis at rutgers.edu> wrote:

>Fran=E7ois Pinard wrote:
>
>> The most useful place for implicit tuple unpacking, in my experience,
>> is likely  at the left of the `in' keyword in `for' statements (and
>> it is even nicer when one avoids extraneous parentheses).
>
>.=2E. and would be nicest (IMO) if default arguments and *varargs were
>allowed too; check http://tinyurl.com/dcb2q for a relevant thread.
>
You can be a little devious about the left of the 'in' in 'for' statements:

----< tupk.py >------------------------------
class Tupk(object):
    def _fset(self, arg):
        # implement unpacking (a, (x, y='default'))
        self.a = arg[0]
        if type(arg[1]) is not tuple: # accept (a, x) in place of (a,(x,))
            self.x = arg[1]
            self.y = 'default for non-tuple'
        else:
            self.x = arg[1][0]
            self.y = len(arg[1])==2 and arg[1][1] or 'default'
    u = property(fset=_fset)
    def __iter__(self):
        return iter((self.a, self.x, self.y))

def test():
    upk = Tupk()
    for upk.u in [(1,(2,3)), (4,(5,)), (7,8)]:
        print upk.a, upk.x, upk.y
    upk.u = (9,10)
    a,b,c = upk
    print 'a=%r, b=%r, c=%r' % (a,b,c)
    print list(upk), tuple(upk)

if __name__=='__main__': test()
---------------------------------------------
Output:
 >>> import tupk
 >>> tupk.test()
 1 2 3
 4 5 default
 7 8 default for non-tuple
 a=9, b=10, c='default for non-tuple'
 [9, 10, 'default for non-tuple'] (9, 10, 'default for non-tuple')
 >>>

You could obviously give Tupk an __init__(fmt, defaults) method that would accept
an unpacking spec like  'a, (x, y=%0))', [<default-value 0>]
And give its instances a __call__ method so you can use it like
    a,b,c = upk('a, (x, y=%0))', [555])((7,8)) => a,b,c == (7, 8, 555)

How useful how often though?

Regards,
Bengt Richter



More information about the Python-list mailing list