functools.py 2.11 KB
Newer Older
Thomas Wouters's avatar
Thomas Wouters committed
1
"""functools.py - Tools for working with functions and callable objects
2 3 4 5 6
"""
# 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>
Thomas Wouters's avatar
Thomas Wouters committed
7 8
#   Copyright (C) 2006 Python Software Foundation.
# See C source code for _functools credits/copyright
9

10
from _functools import partial, reduce
11

Thomas Wouters's avatar
Thomas Wouters committed
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
# 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)
28
       updated is a tuple naming the attributes of the wrapper that
Thomas Wouters's avatar
Thomas Wouters committed
29 30 31 32 33 34
       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:
35
        getattr(wrapper, attr).update(getattr(wrapped, attr, {}))
Thomas Wouters's avatar
Thomas Wouters committed
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
    # 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)