
As last Wednesday was the second anniversary of me joining Google, I thought
it an opportune time to reflect on how I've found learning
Python.
It's
no big secret that Google
is a Python shop. I'd been meaning to learn it a for a while prior to
joining Google, but never found enough reason to other than because it seemed
to be the cool new language. If I had a task that required me to write a
script, I could do it in
Perl in 30
minutes, or spend a day trying to wrap my head around how to do it Python.
I think I'd known and been writing Perl in some form or other for about 9
years. I've hardly written any in the last two, which is a bit sad. I even
bought
Perl Best
Practices shortly after moving over here, and haven't gotten around to
reading it. The only Perl I write these days is for personal tasks to try
and stop myself from going totally rusty.
Anyway, I thought I'd write down some of my observations of Python, from a
"veteran" Perl programmer's perspective. Not that I consider myself to be a
shit-hot Perl coder by any stretch of the imagination...
No punctuation
I really like the lack of punctuation. It makes the code look a lot cleaner.
I go back to Perl and my eyes bleed after trying to dereference a reference
to a scalar, or something like that. It's just ugly in Perl.
No curly braces/indentation for blocks
The indentation thing isn't so bad. If you're using vi, you really need
something along the lines of
set shiftwidth=2
set smarttab
set autoindent
set expandtab
in your
~/.vimrc
What I
do miss is being able to bounce on the
% key to
find the beginning and ending of a block. I've heard rumours of a way to
configure vi to do something similar for Python code, but I haven't gotten
around to finding out. There seems to a general opinion that if you're
writing a block that is so big you can't find the beginning and end of it,
you're probably doing something wrong.
String concatenation
It's always struck me as bizarre how the most obvious way to concatenate a
string in Python is also one of the least efficient. In fact, there's whole
studies been done
into different methods of string concatenation and their efficiencies.
Prototyping is easy
Now I may just be ignorant of some Perl shell here, but the number of times
I've written a quick Perl script in
/tmp to do some
proof-of-concept thing is immeasurable. The fact that you can just fire up a
Python interpreter and try something quick and dirty to see if it's
syntactically sane, or does what you expect is fantastic time saver.
ipython makes it an even more pleasant an experience.
No CPAN
I was initially a bit disappointed that there wasn't something like
CPAN for Python modules. In practice, using
Debian, I haven't found this to be that big a problem though.
List joining is wacky
I still find it weird that you don't join a list by a method of the list,
you do it by a method of the string you want to use to join the list
together with, that is, I think it should be
mylist.join(" ") when
it's really
" ".join(mylist). That's just always struck me as
unintuitive.
urllib2 doesn't hold a candle to libwww-perl
I think even last time I checked with Python 2.5, it's impossible to make a
HEAD request. The mind boggles.
No setuid support
I can't complain too much, I think I heard somewhere it's going away in
Perl as well, but it was certainly very convenient to be able to write
setuid Perl scripts. I miss that convenience in Python. Not that one has to
write setuid scripts all that often.
Regular expression handling is painful
It's about on a par with Java. You just can't beat Perl's
=~
operator.
"There's more than one way to do it" versus only one way to do it
Perl's always had the adage of there being more than one way to do things.
I think that has been its downfall in terms of readability. Heck, I've
written some monstrosities that I've looked back on in a month's time and
wondered what on earth I was thinking at the time. I think it's far easier
to write readable Python than it is to write readable Perl.
I think that's about everything. I never did any real object-oriented
programming in Perl, and so I tend to take a procedural approach to things
in Python as well. I haven't written any massive bodies of code in Python
(although I did help maintain one for about 18 months).
I like Python. It's become my first choice for writing random scripts now.
Now I look at
Ruby like I used to
look at Python when I knew Perl quite well. Ruby has some nice things (like
Perlish regular expression handling), but it brings back all that
punctuation noise again. I'm not in a huge rush to learn it, even though
there's a lot of hype around
Ruby on
Rails. I think I'd rather investigate
Django or
Pylons