Terry Reedy wrote: [...]
if __name__ == '__main__': if '--verbose' in sys.argv: wrap = inject(hook=print)
I do not see the point of all this complication. If you are not trying to optimize the function (and adding such hooks is obviously not), hook = print works just fine (in 3.x ;-).
You're modifying a global variable. Now any other function that calls do_work() for its own purposes suddenly finds it mysteriously printing. A classic action-at-a-distance bug. For a simple stand-alone script, there's no problem, but once you have more complexity in your app, or a library, things become very different.
My apologies, I've been doing a lot of reading about the pros and cons (mostly cons *wink*) of monkey-patching in the Ruby world, the open/closed principle, and various forms of bugs caused by the use of globals. I assumed that the problems would be blindingly obvious. I suppose they were only obvious to me because I'd just immersed myself in them for the last day or so!