py3k feature proposal: field auto-assignment in constructors

André andre.roberge at gmail.com
Sun Jan 27 12:46:29 EST 2008


On Jan 27, 1:06 pm, coldpizza <vri... at gmail.com> wrote:
> There is a pattern that occurs fairly often in constructors in Python
> and other OOP languages.
>
> Let's take an example:
>
> class Server(object):
>     def __init__(self, host, port, protocol, bufsize, timeout):
>         self.host = host
>         self.port = port
>         self.protocol = protocol
>         self.bufsize = bufsize
>         self.maxthreads = maxthreads
>         self.timeout = timeout
>
> Imho, in the class above the assignment to instance fields does not
> contain much programming logic and therefore can be safely 'abstracted
> away' by the language itself with a syntax which would look something
> like this:
>
> class Server(object):
>     def __init__(self, @host, @port, @protocol, @bufsize, @timeout):
>         pass
>
> This would be equivalent to the first example above, yet it does not
> obfuscate the code in any way. Or does it? It does look much cleaner
> to me.
>
> Of course, the ampersand is just an arbitrary choice and might have
> bad connotations for those who read it as 'take address of' but @ has
> some allusion to delegates which maybe is ok.
>
> I am not an experienced programmer and I am not sure if this is
> necessarily a good idea, so I wanted to get some feedback from more
> experienced Pythonistas before submitting it elsewhere.

If you search on this list, you will find that there has been *many*
proposals to remove self (which, I realize is slightly different than
what yo propose) and that the main argument can be summarized as
"Explicit is better than implicit."

Personally, I like the idea you suggest, with the modification that I
would use "." instead of "@", as in

class Server(object):
    def __init__(self, .host, .port, .protocol, .bufsize, .timeout):
        pass

André




More information about the Python-list mailing list