I have of late been learning Python, and am amazed by its superb runtime metaprogramming capabilities. Previously I came across the term 'runtime metaprogramming' was when I was reading about Smalltalk, which as far as I know boasts of best runtime metaprogramming capabilities. How well does Python stack up against Smalltalk w.r.t. metaprogramming? What are the notable differences between the approaches taken by two languages?
Posted as an answer at questioner's request.
One of the big ideas of Smalltalk is orthogonality. Frankly Python suffers in this respect. Not everything works on everything. Examples:

inspect.getargspec() does not work on built-in functions or the results of calls to functools.partial (in the C interpreter anyway).
eval only works for expression strings, and exec only works for statement strings.
Lambda expressions cannot be pickled.
myclass = type('x', (object,), {'__init__': partial(foo, value)}) produces a class that can't be instantiated, whereas passing an equivalent lambda expression instead of a partial works fine.  (Though this may just be a bug not a feature.)

Maybe PyPy doesn't have these problems, I'm not sure. But I do love Python very much and find it very convenient to use metaclasses, currying and the occasional descriptor in real applications.
Python and Smalltalk - Metaprogramming capabilities comparison