使包装器显示为它包含在help()中的函数

时间:2012-12-28 19:52:26

标签: python wrapper docstring pydoc

我很遗憾地使用python 2.4 (不是选择)所以2.5中没有添加的精彩内容(如functools)可以帮助我

我想要包装一个函数,但是当你执行帮助(包装器)时它会显示它包装的函数

我通过

部分实现了这个目标
def a():
    """a's docstring"""
    pass

def wrapper():
    a() 
wrapper.func_name = a.func_name #or should this use __name__ ?
wrapper.func_doc = a.func_doc #or should this use __doc__ ?

现在,help(wrapper)显示a的函数名称和a的docstring。除了感觉hacky之外,这还不包括以下情况下的函数参数:

def b(x, y, z): 
    return a+b+c #or whatever

def wrapper(*args, **kwargs):
    #do something with the arguments
    return b(*args **kwargs)

help(wrapper)导致它显示为b(*args, **kwargs),这显然不是我想要的。 dir(a)中似乎没有任何属性可以帮助我,除非它嵌套在某处。


编辑: 如果您可以使用pypi,请查看装饰模块,这有助于此。

1 个答案:

答案 0 :(得分:4)

使用functools.wraps

请注意,不会伪造参数规范。您可能可以这样做(使用inspect.getargspec来计算foo的参数规范然后攻击bar),但这不是常规的。


编辑:由于您使用的是Python 2.4,因此您必须重新实现functools.wraps的功能。幸运的是它实际上非常简单;它只复制属性__module____name____doc__,然后使用包装函数__dict__更新包装器__dict__。所以你可以这样做:

WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__doc__')
WRAPPER_UPDATES = ('__dict__',)

def update_wrapper(wrapper,
                   wrapped,
                   assigned = WRAPPER_ASSIGNMENTS,
                   updated = 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):
    return partial(update_wrapper, wrapped=wrapped,
                   assigned=assigned, updated=updated)

(仅供参考,这是functools.wraps的实际源代码。)