Python's "only one way to do it" philosophy isn't good?
Douglas Alan
doug at alum.mit.edu
Sat Jun 23 12:39:51 EDT 2007
Steven D'Aprano <steve at REMOVE.THIS.cybersource.com.au> writes:
> Nevertheless, in Python 1+2 always equals 3. You can't say the same thing
> about Lisp.
Well, I can't say much of *anything* about "1 + 2" in Lisp, since
that's not the syntax for adding numbers in Lisp. In Lisp, numbers
are typically added using the "+" function, which might be invoked
like so:
(+ 1 2 3)
This would return 6.
It's true that some dialects of Lisp will let you redefine the "+"
function, which would typically be a bad idea. Other dialects would
give you an error or a warning if you tried to redefine "+". I would
fall more into the latter camp. (Though sometimes you might want a
way to escape such restrictions with some sort of "yes, I really want
to shoot myself in the head" declaration, as you may want to
experiment, not with changing the meaning of "(+ 1 2"), but rather
with adding some additional useful capability to the "+" function that
it doesn't already have.
Back on the Python front, although "1 + 2" might always equal 3 in
Python, this is really rather cold comfort, since no useful code would
ever do that. Useful code might include "a + 1", but since you can
overload operators in Python, you can say little about what "a + 1"
might do or mean on the basis of the syntax alone.
Furthermore, in Python you can redefine the "int" data type so that
int.__add__ does a subtraction instead. Then you end up with such
weirdness as
>>> int(1.0) + int(2.0)
-1
Also, you can redefine the sum() function in Python.
So, we see that Python offers you a multitude of ways to shoot
yourself in the head.
One of the things that annoys me when coding in Python (and this is a
flaw that even lowly Perl has a good solution for), is that if you do
something like
longVarableName = foo(longVariableName)
You end up with a bug that can be very hard to track down. So one use
for macros would be so that I can define "let" and "set" statements so
that I might code like this:
let longVariableName = 0
set longVarableName = foo(longVariableName)
Then if longVarableName didn't already exist, an error would be
raised, rather than a new variable being automatically created for me.
The last time I mentioned this, Alex Martelli basically accused me of
being an idiot for having such trivial concerns. But, ya know -- it
isn't really a trivial concern, despite Martelli's obviously high
intellect. A woman I work with who is bringing up a CMS using Drupal
was complaining to me bitterly that this very same issue in PHP was
causing her bugs that were hard to track down. Unfortunately, I could
not gloat over her with my Python superiority, because if Drupal were
written in Python, rather than PHP, she'd have the very same problem
-- at least in this regard.
|>oug
More information about the Python-list
mailing list