
On Fri, Jun 17, 2011 at 9:26 AM, Nick Coghlan <ncoghlan@gmail.com> wrote:
atdef VAR=EXPR [, VAR=EXPR]* Such a statement would readily cover the speed enhancement,
early-binding and shared state use cases for the default argument hack
Doing things this way however removes one of the chief benefits of the inject statement, the ability to create multiple versions of the same function with different sets of shared data. You earlier gave an example similar to this as an example of what the syntax under your proposal would look like. def example(arg): """Record and return arguments seen""" atdef cache=set() #do something cache.add(arg) return arg under proposal 4 (inject as full blown function, usable like any decorator) it would look like this instead @inject(cache = set()) def example(arg): """Record and return arguments seen""" #do something cache.add(arg) return arg but what if, later, you decided you needed 10 different 'example' functions each with its own cache as well as the ability to make more. under your proposal we would have to make extensive changes. turning the code into def make_example(): def example(arg): """Record and return arguments seen""" #do something cache.add(arg) return arg return example example_list = [make_example() for i in range(10)] this code is rather difficult to read and it is difficult at first glance to figure out what is actually happening under proposal 4 the result would be much simpler. we could just remove the @inject and put that on in the list comprehension, like so. def _example_func(arg): """Record and return arguments seen""" #do something cache.add(arg) return arg example_list = [inject(cache=set())( _example_func) for i in range(10)] make_example = lambda: inject(cache=set())( _example_func) this is IMO far easier to read and understand. Furthermore it gives the added benefit in that you can chose to run 'example' so that it uses a true global variable, instead of an injected one. --Alex