我很遗憾地使用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,请查看装饰模块,这有助于此。
答案 0 :(得分:4)
请注意,不会伪造参数规范。您可能可以这样做(使用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
的实际源代码。)