Working mostly in Python at the day job has been an interesting experience. For them most part integrating the new language and libraries has been fairly straightforward. The dynamic nature leads to efficiencies on one end, but it also introduces a whole host of annoyances. I spend a lot more time tracking down subtle errors that would have been immediately obvious in Java, for example.

Of all the things I've encountered so far, the thing that's caused me the most headache has been a dumb monkey patch made by the M2Crypto library. M2Crypto is a replacement SSL library required by own of our tools. It apparently provides some functionality not in the standard python SSL code. That's fine, except that in order to provide it's functionality, M2Crypto does this brilliant patch of urllib:

This apparently works for most urllib use, the the urllib.urlretrieve, which we were using, fails when retrieving https URLs. It was a bear to track down, but once I realized that the function worked fine in a bare python and failed in the virtualenv python with all our third party libraries, it just took some time single-stepping through in the debugger to figure out where the two environments differed.

Since the open_https method is completely destroyed my the patch, the only option was to switch to urllib2. However, since urllib2 doesn't seem to have kept the urlretrieve function around, I had to rewrite the urlretrieve functionality on top of it.

This is exactly the kind of thing I was most afraid of when it came to working with Python - having to deal with other developers who decided it would be great to change the way base system libraries work. Looking at the big picture, it was really only a minor annoyance - a few lost hours at most. The real harm is in the feeling of instability it brings. I want to know exactly what the system is doing and why, and it's hard to do when one library decides to muck around with another libraries internals.