[Python-ideas] Fwd: Define a method or function attributeoutside of a class with the dot operator

Steven D'Aprano steve at pearwood.info
Sat Feb 11 23:10:52 EST 2017


On Fri, Feb 10, 2017 at 06:17:54PM +0200, Markus Meskanen wrote:
> Well yes, but I think you're a bit too fast on labeling it a mistake to use
> monkey patching...

More importantly, I think we're being a bit too quick to label this 
technique "monkey-patching" at all. Monkey-patching (or MP for brevity) 
implies making modifications to some arbitrary *uncooperative* class (or 
instance). When you're plugging electrodes into a monkey's brain, the 
monkey has no say in it.

This proposed syntax can, of course, be used that way, but Python is 
already a "consenting adults" language and already has setattr:

setattr(some_class, 'get_shrubbery', get_shrubbery)

which is all you need to enable MP for good or evil.

There have been a few times where I would have used this syntax if it 
had been available, and none of them were MP. They were injecting 
methods into classes I controlled.

I suspect that this technique wouldn't feel so bad if we had a proper, 
respectable sounding "design pattern" name for it, like "method 
injection" or something. I expect that the only reason there is no name 
for this is that Java doesn't allow it. (I think.) So I'm going to call 
it "method injection".

I don't think there's any evidence that slightly cleaner syntax for 
method injection will encourage MP. We already have clean syntax to 
inject arbitrary attributes (including methods made with lambda):

TheClass.method = lambda self: ...

and I don't think there's an epidemic of MP going on.



-- 
Steve


More information about the Python-ideas mailing list