I think you're right. I already found a task for Python to do, spent a couple weeks (off and on) refining it, and at the end I seemed to have used all of the prominent features of Python somewhere in that script. At the end of that, I had this vague feeling that I now "knew" Python and wasn't sure what was left to learn.
So, you are confirming my vague feeling and I can now move on to Scala and decide whether or not to switch to Arc once it emerges. :)
Python can definitely fit in your head, as far as the language. Reading lots of code is a good way to learn the idioms.
But, regardless of the very sound reasons for it to be the way it is, it's a very intimidating codebase, and a really good case study in the "reinvent everything" mindset. (It's quite powerful, and I've worked with several of the guys who built it, as I did contract work for Zope Corp for a few years, and I have the utmost respect for their talent and intellect. They're some of the smartest developers I've ever met. But it's not quite like anything else I've ever seen when it comes to having a learning cliff, even with some pre-existing Python knowledge.)
I'm told a great place to read good code, both Python and C, is to read the code that makes Python.
This is true of any language to some degree, although some are worse than others, and if the code was purposefully written in some non-traditional way it can be even harder.
send(to, from, count)
register short *to, *from;
register count;
{
register n = (count + 7) / 8;
switch (count % 8) {
case 0: do { *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while (--n > 0);
}
}