the annoying, verbose self

Kay Schluehr kay.schluehr at gmx.net
Fri Nov 23 23:48:06 EST 2007


On Nov 24, 12:54 am, Steven D'Aprano <st... at REMOVE-THIS-
cybersource.com.au> wrote:

> The correct solution to your example is to get rid of the attribute
> lookups from the expression completely:
>
> def abs(self):
>     x, y, z = self.x, self.y, self.z
>     return math.sqrt(x**2 + y**2 + z**2)
>
> It's probably also faster, because it looks up the attributes only once
> each, instead of twice.
>
> --
> Steven.

I like this pattern but less much I like the boilerplate. What about
an explicit unpacking protocol and appropriate syntax?

def abs(self):
     x, y, z by self
     return math.sqrt(x**2 + y**2 + z**2)

expands to

def abs(self):
     x, y, z = self.__unpack__("x","y","z")
     return math.sqrt(x**2 + y**2 + z**2)

This would have another nice effect on expression oriented programming
where people use to create small "domain specific languages" using
operator overloading:

x,y,z by Expr

class Expr(object):
    def __init__(self, name):
        self.name = name
        self._sexpr = ()

    def __unpack__(self, *names):
        if len(names)>1:
            return [Expr(name) for name in names]
        elif len(names) == 1:
            return Expr(names[0])
        else:
            raise ValueError("Nothing to unpack")

    def __add__(self, other):
        e = Expr("")
        e._sub = ('+',(self, other))
        return e

    def __repr__(self):
        if self._sexpr:
            return self._sexpr[0].join(str(x) for x in self._sexpr[1])
        return self.name

>>> x,y by Expr
>>> x+y
x+y
>>> 4+x
4+x






More information about the Python-list mailing list