[Python-Dev] Possible optimization for LOAD_FAST ?

Steven D'Aprano steve at pearwood.info
Wed Jan 5 00:13:31 CET 2011

Guido van Rossum wrote:
> On Tue, Jan 4, 2011 at 1:50 PM, Steven D'Aprano <steve at pearwood.info> wrote:
>> I've been known to monkey-patch builtins in the interactive interpreter and
>> in test code. One example that comes to mind is that I had some
>> over-complicated recursive while loop (!), and I wanted to work out the Big
>> Oh behaviour so I knew exactly how horrible it was. Working it out from
>> first principles was too hard, so I cheated: I knew each iteration called
>> len() exactly once, so I monkey-patched len() to count how many times it was
>> called. Problem solved.
> But why couldn't you edit the source code?

Because there was no source code -- I was experimenting in the 
interactive interpreter. I could have just re-created the function by 
using the readline history, but it was just easier to redefine len.

Oh... it's just occurred to me that you were asking for use-cases for 
assigning to builtins.len directly, rather than just to len. No, I've 
never done that -- sorry for the noise.

>> I also have a statistics package that has its own version of sum, and I rely
>> on calls to sum() from within the package picking up my version rather than
>> the builtin one.
> As long as you have a definition or import of sum at the top of (or
> really anywhere in) the module, that will still work. It's only if you
> were to do things like
> import builtins
> builtins.len = ...
> (whether inside your package or elsewhere) that things would stop
> working with the proposed optimization.

Ha, well, that's the sort of thing that gives monkey-patching a bad 
name, surely? Is there a use-case for globally replacing builtins for 
all modules, everywhere? I suppose that's what you're asking.

The only example I can think of might be the use of mocks for testing 
purposes, but even there I'd prefer to inject the mock into the module I 
was testing:

mymodule.len = mylen

But I haven't done much work with mocks, so I'm just guessing.


More information about the Python-Dev mailing list