| 
									
										
										
										
											2006-06-08 13:54:49 +00:00
										 |  |  | """functools.py - Tools for working with functions and callable objects
 | 
					
						
							| 
									
										
										
										
											2006-05-29 20:27:44 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | # Python module wrapper for _functools C module | 
					
						
							|  |  |  | # to allow utilities written in Python to be added | 
					
						
							|  |  |  | # to the functools module. | 
					
						
							|  |  |  | # Written by Nick Coghlan <ncoghlan at gmail.com> | 
					
						
							| 
									
										
										
										
											2006-06-08 13:54:49 +00:00
										 |  |  | #   Copyright (C) 2006 Python Software Foundation. | 
					
						
							|  |  |  | # See C source code for _functools credits/copyright | 
					
						
							| 
									
										
										
										
											2006-05-29 20:27:44 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | from _functools import partial | 
					
						
							| 
									
										
										
										
											2007-08-27 20:51:00 +00:00
										 |  |  | from __builtin__ import reduce | 
					
						
							| 
									
										
										
										
											2006-05-29 20:27:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-08 13:54:49 +00:00
										 |  |  | # update_wrapper() and wraps() are tools to help write | 
					
						
							|  |  |  | # wrapper functions that can handle naive introspection | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__') | 
					
						
							|  |  |  | WRAPPER_UPDATES = ('__dict__',) | 
					
						
							|  |  |  | def update_wrapper(wrapper, | 
					
						
							|  |  |  |                    wrapped, | 
					
						
							|  |  |  |                    assigned = WRAPPER_ASSIGNMENTS, | 
					
						
							|  |  |  |                    updated = WRAPPER_UPDATES): | 
					
						
							|  |  |  |     """Update a wrapper function to look like the wrapped function
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        wrapper is the function to be updated | 
					
						
							|  |  |  |        wrapped is the original function | 
					
						
							|  |  |  |        assigned is a tuple naming the attributes assigned directly | 
					
						
							|  |  |  |        from the wrapped function to the wrapper function (defaults to | 
					
						
							|  |  |  |        functools.WRAPPER_ASSIGNMENTS) | 
					
						
							| 
									
										
										
										
											2006-10-26 19:16:46 +00:00
										 |  |  |        updated is a tuple naming the attributes of the wrapper that | 
					
						
							| 
									
										
										
										
											2006-06-08 13:54:49 +00:00
										 |  |  |        are updated with the corresponding attribute from the wrapped | 
					
						
							|  |  |  |        function (defaults to functools.WRAPPER_UPDATES) | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     for attr in assigned: | 
					
						
							|  |  |  |         setattr(wrapper, attr, getattr(wrapped, attr)) | 
					
						
							|  |  |  |     for attr in updated: | 
					
						
							| 
									
										
										
										
											2006-10-27 16:39:10 +00:00
										 |  |  |         getattr(wrapper, attr).update(getattr(wrapped, attr, {})) | 
					
						
							| 
									
										
										
										
											2006-06-08 13:54:49 +00:00
										 |  |  |     # Return the wrapper so this can be used as a decorator via partial() | 
					
						
							|  |  |  |     return wrapper | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def wraps(wrapped, | 
					
						
							|  |  |  |           assigned = WRAPPER_ASSIGNMENTS, | 
					
						
							|  |  |  |           updated = WRAPPER_UPDATES): | 
					
						
							|  |  |  |     """Decorator factory to apply update_wrapper() to a wrapper function
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |        Returns a decorator that invokes update_wrapper() with the decorated | 
					
						
							|  |  |  |        function as the wrapper argument and the arguments to wraps() as the | 
					
						
							|  |  |  |        remaining arguments. Default arguments are as for update_wrapper(). | 
					
						
							|  |  |  |        This is a convenience function to simplify applying partial() to | 
					
						
							|  |  |  |        update_wrapper(). | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     return partial(update_wrapper, wrapped=wrapped, | 
					
						
							|  |  |  |                    assigned=assigned, updated=updated) |