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 understandable.
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 mess.
Here's another way to approach the problem:
def hook(self, arg): pass
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 worker.do_work()
Now you can expand the HookableWorker class by adding more methods that all share the same hook, still without anything being global.