On 04/01/2011 23:29, Guido van Rossum wrote:
On Tue, Jan 4, 2011 at 3:13 PM, Steven D'Aprano<st...@pearwood.info> wrote:
Guido van Rossum wrote:
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.
The interactive interpreter will always be excluded from this kind of
optimization (well, in my proposal anyway).
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.
There are two versions of the "assign to global named 'len'" idiom.
One is benign: if the assignment occurs in the source code of the
module (i.e., where the compiler can see it when it is compiling the
module) the optimization will be disabled in that module.
The second is not: if a module-global named 'len' is set in a module
from outside that module, the compiler cannot see that assignment when
it considers the optimization, and it may generate optimized code that
will not take the global by that name into account (it would use an
opcode that computes the length of an object directly).
The third way to mess with the optimization is messing with
builtins.len. This one is also outside what the compiler can see.
[...]
Ha, well, that's the sort of thing that gives monkey-patching a bad name,
surely?
Monkey-patching intentionally has a bad name -- there's always a code
smell. (And it looks like one, too. :-)
Is there a use-case for globally replacing builtins for all modules,
everywhere? I suppose that's what you're asking.
I think the folks referring to monkey-patching builtins in unittests
were referring to this. But they might also be referring to the second
option above.
I prefer monkey patching builtins (where I do such a thing) in the
namespace where they are used. I know it is *common* to monkeypatch
__builtins__.open (python 2) however.
I don't recall monkey patching anything other than open and raw_input
myself but I *bet* there are people doing it for reasons they see as
legitimate in tests. :-)
Michael
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.
Same here. But it would fail (i.e. not be picked up by the
optimization) either way.
--
http://www.voidspace.org.uk/
May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessing http://www.sqlite.org/different.html
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com