After the recent discussion of resource acquisition, I went back and read PEP 310 again myself. Something that I wondered was whether it would be possible to include in the PEP a generic wrapper function that could be used inline in the 'with' statement. That is, instead of resource control via lots of throwaway subclasses like this: class Resource_Foo(Foo): __exit__ = foo_done with myFoo = Resource_Foo(args): # Do stuff We would have: with myFoo = resource(Foo(args), Foo.foo_done): # Do stuff or with myFile = resource(file("bar.txt"), file.close): # Do stuff or my_bar = Bar() with resource(my_bar, my_bar.start, my_bar.stop): # Do stuff Having a recommended way to wrap objects which don't support the 'with' protocol natively would seem to be better than having everyone invent there own methodology. Possible definition for the 'resource' function (this mechanism for adding the relevant methods has been tested in Python 2.2): def resource(obj, get_resource=None, free_resource): # Set up the enter method (if there is one) if get_resource: enter_obj = getattr(enter_meth, "im_self", None) if not enter_obj: # It's a function or unbound method obj.__enter__ = lambda: get_resource(obj) elif enter_obj is obj: # It's a bound method of our object obj.__enter__ = get_resource else: raise ValueError("Resource and bound enter method do not match") # Set up the exit method if not getattr(free_resource, "im_self", None): # It's a function or unbound method obj.__exit__ = lambda: free_resource(obj) elif free_resource.im_self is obj: # It's a bound method of our object obj.__exit__ = free_resource else: raise ValueError("Resource and bound exit method do not match") # Return the object so that we can use the assignment # form of the 'with' statement return obj Regards, Nick. -- Nick Coghlan Brisbane, Australia
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4