python-2.5.2/win32/Lib/functools.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     1 """functools.py - Tools for working with functions and callable objects
       
     2 """
       
     3 # Python module wrapper for _functools C module
       
     4 # to allow utilities written in Python to be added
       
     5 # to the functools module.
       
     6 # Written by Nick Coghlan <ncoghlan at gmail.com>
       
     7 #   Copyright (C) 2006 Python Software Foundation.
       
     8 # See C source code for _functools credits/copyright
       
     9 
       
    10 from _functools import partial
       
    11 
       
    12 # update_wrapper() and wraps() are tools to help write
       
    13 # wrapper functions that can handle naive introspection
       
    14 
       
    15 WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')
       
    16 WRAPPER_UPDATES = ('__dict__',)
       
    17 def update_wrapper(wrapper,
       
    18                    wrapped,
       
    19                    assigned = WRAPPER_ASSIGNMENTS,
       
    20                    updated = WRAPPER_UPDATES):
       
    21     """Update a wrapper function to look like the wrapped function
       
    22 
       
    23        wrapper is the function to be updated
       
    24        wrapped is the original function
       
    25        assigned is a tuple naming the attributes assigned directly
       
    26        from the wrapped function to the wrapper function (defaults to
       
    27        functools.WRAPPER_ASSIGNMENTS)
       
    28        updated is a tuple naming the attributes off the wrapper that
       
    29        are updated with the corresponding attribute from the wrapped
       
    30        function (defaults to functools.WRAPPER_UPDATES)
       
    31     """
       
    32     for attr in assigned:
       
    33         setattr(wrapper, attr, getattr(wrapped, attr))
       
    34     for attr in updated:
       
    35         getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
       
    36     # Return the wrapper so this can be used as a decorator via partial()
       
    37     return wrapper
       
    38 
       
    39 def wraps(wrapped,
       
    40           assigned = WRAPPER_ASSIGNMENTS,
       
    41           updated = WRAPPER_UPDATES):
       
    42     """Decorator factory to apply update_wrapper() to a wrapper function
       
    43 
       
    44        Returns a decorator that invokes update_wrapper() with the decorated
       
    45        function as the wrapper argument and the arguments to wraps() as the
       
    46        remaining arguments. Default arguments are as for update_wrapper().
       
    47        This is a convenience function to simplify applying partial() to
       
    48        update_wrapper().
       
    49     """
       
    50     return partial(update_wrapper, wrapped=wrapped,
       
    51                    assigned=assigned, updated=updated)