51 lines · 2.1 KB · Python
RawDownload
"""functools.py - Tools for working with functions and callable objects"""# 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>#   Copyright (C) 2006 Python Software Foundation.# See C source code for _functools credits/copyright from _functools import partial # 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)       updated is a tuple naming the attributes off the wrapper that       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:        getattr(wrapper, attr).update(getattr(wrapped, attr, {}))    # 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)