[Python-Dev] New syntax for 'dynamic' attribute access (original) (raw)

Brett Cannon brett at python.org
Tue Feb 13 00:47:26 CET 2007


On 2/12/07, Guido van Rossum <guido at python.org> wrote:

FWIW, I'm strongly -1 on the "->" notation. As a C programmer it's got too many neurons committed to it.

I recommend that you do some experiments with the readability of the .[...] notation, e.g. write a program that randomly generates x.[foo] and x[foo], and see how fast you can spot the difference. I bet that you won't have any trouble.

OK, so real-world examples. First, foo.(name), from urllib.py::

    name = 'open_' + urltype
    self.type = urltype
    name = name.replace('-', '_')
    if not hasattr(self, name):
        if proxy:
            return self.open_unknown_proxy(proxy, fullurl, data)
        else:
            return self.open_unknown(fullurl, data)
    try:
        if data is None:
            return self.(name)(url)
        else:
            return self.(name)(url, data)
    except socket.error, msg:
        raise IOError, ('socket error', msg), sys.exc_info()[2]

and also::

    name = 'http_error_%d' % errcode
    if hasattr(self, name):
        method = self.(name)
        if data is None:
            result = method(url, fp, errcode, errmsg, headers)
        else:
            result = method(url, fp, errcode, errmsg, headers, data)
        if result: return result
    return self.http_error_default(url, fp, errcode, errmsg, headers)

And here is urllib2.py for .[] (used different files so you wouldn't just remember where the change was)::

    if attr[:12] == '_Request__r_':
        name = attr[12:]
        if hasattr(Request, 'get_' + name):
            self.['get_' + name]()
            return self.[attr]
    raise AttributeError, attr

and::

    handlers = chain.get(kind, ())
    for handler in handlers:
        func = handler.[meth_name]
        result = func(*args)
        if result is not None:
            return result

Neither version jumps out at me strongly, although between the two the .[] version shows up the best. But that might also be because of the lower noise when used in a call.

-Brett



More information about the Python-Dev mailing list