[Python-ideas] 'Injecting' objects as function-local constants

Greg Ewing greg.ewing at canterbury.ac.nz
Tue Jun 14 01:29:40 CEST 2011

Steven D'Aprano wrote:

> Because you aren't monkey-patching the hook function (or, heaven help 
> us, monkey-patching builtins.print!) you don't need to fear 
> side-effects.

It's still rather non-obvious what's going on, though. Copious
commenting would be needed to make this style of coding

Also, it doesn't seem to generalise. What if the function in
question calls other functions, which call other functions,
which themselves need a verbose option? It seems you would
need to explicitly wrap all the sub-function calls to pass
the hook on to them. And what if there is more than one
option to be hooked? You'd rapidly end up with a nightmarish

Here's another way to approach the problem:

   class HookableWorker(object):

     def hook(self, arg):

     def do_work(self):
       self.hook("Starting work")
       self.hook("Stopping work")

   def be_verbose(arg):
     print arg

   def main():
     worker = HookableWorker()
     if "--verbose" in sys.argv:
       worker.hook = be_verbose

Now you can expand the HookableWorker class by adding more methods
that all share the same hook, still without anything being global.


More information about the Python-ideas mailing list