Double underscores -- ugly?

B

benhoyt

Hi guys,

I've been using Python for some time now, and am very impressed with
its lack of red tape and its clean syntax -- both probably due to the
BDFL's ability to know when to say "no".

Most of the things that "got me" initially have been addressed in
recent versions of Python, or are being addressed in Python 3000. But
it looks like the double underscores are staying as is. This is
probably a good thing unless there are better alternatives, but ...

Is it just me that thinks "__init__" is rather ugly? Not to mention
"if __name__ == '__main__': ..."?

I realise that double underscores make the language conceptually
cleaner in many ways (because fancy syntax and operator overloading
are just handled by methods), but they don't *look* nice.

A solution could be as simple as syntactic sugar that converted to
double underscores behind the scenes. A couple of ideas that come to
my mind (though these have their problems too):

def ~init(self): # shows it's special, but too like a C++ destructor
def +init(self): # a bit too additive :)
defop add(self, other): # or this, equivalent to "def __add__"
def operator add(self, other): # new keyword, and a bit wordy

Has anyone thought about alternatives? Is there a previous discussion
on this I can look up?

Cheers,
Ben.
 
B

Ben Finney

benhoyt said:
I realise that double underscores make the language conceptually
cleaner in many ways (because fancy syntax and operator overloading
are just handled by methods), but they don't *look* nice.

That's a good thing, in that it draws attention to the names. The
convention is by design: these names will be treated specially, so
they should stand out visually to the reader.
A solution could be as simple as syntactic sugar that converted to
double underscores behind the scenes. A couple of ideas that come to
my mind (though these have their problems too):

def ~init(self): # shows it's special, but too like a C++ destructor
def +init(self): # a bit too additive :)
defop add(self, other): # or this, equivalent to "def __add__"
def operator add(self, other): # new keyword, and a bit wordy

None of these, IMO, meet the "needs to stand out" requirement met by
double-underscore names.

They also introduce special cases for the language parser (and thus
for the reader to understand how the language will be parsed), whereas
double-underscore names work without any special syntax handling.
 
B

Berwyn

Is it just me that thinks "__init__" is rather ugly? Not to mention
"if __name__ == '__main__': ..."?

That ugliness has long been my biggest bugbear with python, too. The
__name__ == '__main__' thing is something I always have to look up,
every time I use it, too ... awkward.

I'd settle for:

hidden def init(self): # which could be extended to work
for everything "hidden x=3"
...

And for __name__ == '__main__' how about:

if sys.main():
...
 
B

Ben Finney

benhoyt said:
Not to mention "if __name__ == '__main__': ..."?

Unlike the double-underscore attribute names for signalling "special
meaning", that particular hack is IMO unnecessarily ugly.

I don't, however, think it's likely to go away any time soon. If
that's the ugliest convention people can find in Python (as opposed to
the limitless *non*-conventional ugliness that programmers are capable
of in any language), then Python is doing pretty well.
 
A

Asun Friere

benhoyt said:
Is it just me that thinks "__init__" is rather ugly?

I used to hate looking at and having the type out all those
underscores (surely two leading or one on either side would do?), but
I've gotten so used to it by now the eyes don't see and the fingers
work by themselves.
Not to mention
"if __name__ == '__main__': ..."?

Which ugliness is only trumped by the use of 'main' as a function name
thus:

if __name__ == '__main__' : main()
 
T

Terry Reedy

| Hi guys,
|
| I've been using Python for some time now, and am very impressed with
| its lack of red tape and its clean syntax -- both probably due to the
| BDFL's ability to know when to say "no".
|
| Most of the things that "got me" initially have been addressed in
| recent versions of Python, or are being addressed in Python 3000. But
| it looks like the double underscores are staying as is. This is
| probably a good thing unless there are better alternatives, but ...
|
| Is it just me that thinks "__init__" is rather ugly?

No, the reservered special names are supposed to be ugly ;-) -- or at least
to stand out. However, since special methods are almost always called
indirectly by syntax and not directly, only the class writer or reader, but
not users, generally see them.

| Not to mention "if __name__ == '__main__': ..."?

Someone (perhaps me) once suggested on pydev using 'main' instead, but a
couple of people piped back that they regularly name their main module (as
opposed to the startup script) 'main'. So much for that idea. 'main__'
might not look as bad, but anything other that '__main__' introduces an
inconsistency with the reserved name rule. Changing '__name__' has the
same pair of problems (conflict with user names and consistency). So I
decided to live with the current incantation.

Terry Jan Reedy



|
 
R

Raymond Hettinger

[benhoyt]
Is it just me that thinks "__init__" is rather ugly?

I also find it unattractive and unpleasant to type.

In Py3.0, I would support a single underscore convention, _init_ or
somesuch.

I'm not sure what the aesthetic reasons are, but somehow the change
from double underscores to single underscores makes the result a lot
less offensive to my eyes.

Raymond
 
B

benhoyt

[Terry Jan Reedy]
No, the reservered special names are supposed to be ugly ;-) -- or at least
to stand out. However, since special methods are almost always called
indirectly by syntax and not directly, only the class writer or reader, but
not users, generally see them.

Fair enough, but my problem is that class writers are users too. :)

-Ben
 
D

Duncan Booth

Berwyn said:
That ugliness has long been my biggest bugbear with python, too. The
__name__ == '__main__' thing is something I always have to look up,
every time I use it, too ... awkward.

I'd settle for:

hidden def init(self): # which could be extended to work
for everything "hidden x=3"
...

And for __name__ == '__main__' how about:

if sys.main():
...

Or even:

@hidden
def init(self): ...

@main
def mymainfunc():
...


The first of those probably wants some metaclass support to make it work
cleanly, but here's a sample implementation for the second one:

import sys, atexit
def main(f):
"""Decorator for main function"""
def runner():
sys.exit(f())
if f.func_globals['__name__']=='__main__':
atexit.register(runner)
return f

print "define mymainfunc"
@main
def mymainfunc(args=sys.argv):
print "Got args", args
return 3
print "end of script"

If you have multiple functions marked as main that will run them in
reverse order, so it might be better to put them on a list and use a
single runner to clear the list. Also, I have no idea what happens to
the exit code if you use this decorator more than once.

BTW, should anyone be wondering, you can still use atexit inside a
function called from atexit and any registered functions are then called
when the first one returns.
 
M

Marco Mariani

Ben said:
That's a good thing, in that it draws attention to the names.

Well, double underscore is awful when you have to read code with the
wrong typeface, possibly printed.
 
J

Jason

Hi guys,

I've been using Python for some time now, and am very impressed with
its lack of red tape and its clean syntax -- both probably due to the
BDFL's ability to know when to say "no".

Most of the things that "got me" initially have been addressed in
recent versions of Python, or are being addressed in Python 3000. But
it looks like the double underscores are staying as is. This is
probably a good thing unless there are better alternatives, but ...

Is it just me that thinks "__init__" is rather ugly? Not to mention
"if __name__ == '__main__': ..."?

I realise that double underscores make the language conceptually
cleaner in many ways (because fancy syntax and operator overloading
are just handled by methods), but they don't *look* nice.

A solution could be as simple as syntactic sugar that converted to
double underscores behind the scenes. A couple of ideas that come to
my mind (though these have their problems too):

def ~init(self): # shows it's special, but too like a C++ destructor
def +init(self): # a bit too additive :)
defop add(self, other): # or this, equivalent to "def __add__"
def operator add(self, other): # new keyword, and a bit wordy

Has anyone thought about alternatives? Is there a previous discussion
on this I can look up?

Cheers,
Ben.

Hmm. I must be the only person who doesn't think the double
underscores are ugly. To me, they seem to provide plenty of attention
to the special methods, but still appear clean due to their almost
white-space-like nature. Given the use of underscores to indicate
italics in plain-text, the special methods seem (to me) to have extra
emphasis.

I don't print my code often, so that's a caveat, and I came from a C/C+
+ background.

I agree with Ben, that your suggestions don't particularly stand out.
They might stand out if the editor you used supported syntax
highlighting. Personally, I find the examples with the plus and tilde
(+, ~) to be more noisy and ugly than the underscores.

Think of the underscores as a serene white-space day, with a simple
black road that takes you to the special name. Or, you can wonder
what I'm smoking when I code.... *grin*

--Jason
 
W

Wildemar Wildenburger

Jason said:
Hmm. I must be the only person who doesn't think the double
underscores are ugly.
Nope. I like them too. :)

Frankly, I think it's just a matter of adaption. I too found it rather
"ugly" in the beginning, but with anything, I've gotten used to it. (And
I wholeheartedly support your "looks like underlined / is unintrusive
like whitespace" argument.)

/W
 
H

Hyuga

Or even:

@hidden
def init(self): ...

@main
def mymainfunc():
...

I'd much rather type a few underscores than have to constantly use
decorators. I don't see what's so ugly about __init__. To me it just
looks like it's underscored, though maybe that comes from having
worked with a lot of wikis. But I really don't find it an
encumbrance, and the fact that it requires no special handling from
the parser is just part of the beautiful simplicity of Python.

Hyuga
 
B

Ben Finney

Marco Mariani said:
Well, double underscore is awful when you have to read code with the
wrong typeface, possibly printed.

The wrong typeface can make anything awful to read. This is unrelated
to double-underscores.

The solution, therefore, is also unrelated to double-underscores:
choose an appropriate typeface.
 
C

castironpi

Nope. I like them too. :)

Frankly, I think it's just a matter of adaption. I too found it rather
"ugly" in the beginning, but with anything, I've gotten used to it. (And
I wholeheartedly support your "looks like underlined / is unintrusive
like whitespace" argument.)

/W

My editor actually renders them as miniature chess pieces. The
bartender said she runs a pre-execution step, that searches and
replaces a double-colon with the underscores.
 
B

benhoyt

My editor actually renders [underscores] as miniature chess pieces.
The bartender said she runs a pre-execution step, that searches and
replaces a double-colon with the underscores.

Heh, that makes me think. Great use for character encodings! Just like
Tim Hatch's "pybraces", we could use any character combo we liked and
just implement a character encoding for it. See:
http://timhatch.com/projects/pybraces/

Just kidding.

Seriously, though, I give in. There's no perfect solution, and it's
probably just a matter of getting over it. Though I wouldn't mind
Raymond Hettinger's suggestion of using single underscores as in
_init_. Only half as ugly. :)

Then again, what's stopping us just using a single leading underscore?
Nobody calls their own private methods _init or _add ... and that's
only 1/4 the ugliness, which is getting pretty good.

-Ben
 
S

Steve Holden

My editor actually renders them as miniature chess pieces. The
bartender said she runs a pre-execution step, that searches and
replaces a double-colon with the underscores.

If you're taking programming advice from a bartender your postings
suddenly start to make sense (though not, unfortunately, as comments
about programming). Do you think perhaps yo might be trying just a
little too hard?

regards
Steve
 
B

Ben Finney

benhoyt said:
Then again, what's stopping us just using a single leading underscore?
Nobody calls their own private methods _init or _add

You must be looking at different code from the rest of us. A single
leading underscore on the name *is* the convention for "this attribute
is not part of the external interface", which is about as "private" as
Python normally gets.
 
E

Erik Max Francis

My editor actually renders them as miniature chess pieces. The
bartender said she runs a pre-execution step, that searches and
replaces a double-colon with the underscores.

I'm sorry, did you hit your head before dashing off your recent posts or
something?
 
I

Ivan Illarionov

I would like to see something like %init or &init to be converted to
__init__ behind the scenes. And $something to be converted to
self.something. But, unfortunately, most Python people would consider
this ugly just because Perl uses too much syntactic sugar and anything
Perl-like is considered ugly in Python community. So, unless Perl die,
I believe that Python will remain sugar-free.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,598
Members
45,161
Latest member
GertrudeMa
Top