То, что вы запрашиваете, очень трудно сделать «должным образом», потому что help
получает сигнатуру функции от inspect.getargspec
, которая, в свою очередь, получает ее от самоанализа, который нельзя обмануть напрямую - сделать это «правильно» означало бы создание нового функционального объекта на лету (вместо простой функции-оболочки) с правильными именами и числами аргументов (и значениями по умолчанию). Другими словами, требуется чрезвычайно сложный, продвинутый взлом черного байт-кода.
Я думаю, что это может быть проще сделать с помощью обезьяньего патча (никогда не приятная перспектива, но иногда единственный способ выполнить задачи по настройке, которые в противном случае настолько сложны, что оказывается почти невозможным, например, тот, который вам нужен) - заменить real inspect.getargspec с вашей собственной функцией-аналогом, которая использует таблицу обратного просмотра (отображение генерируемых вами функций-оболочек в аргументы-аргументы упакованных функций и в противном случае делегирование в реальную вещь).
import functools
import inspect
realgas = inspect.getargspec
lookaside = dict()
def fakegas(f):
if f in lookaside:
return lookaside[f]
return realgas(f)
inspect.getargspec = fakegas
def deco(fn):
@functools.wraps(fn)
def x(*args, **kwargs):
return fn(*args, **kwargs)
lookaside[x] = realgas(fn)
return x
@deco
def x(a, b=23):
"""Some doc for x."""
return a + b
help(x)
При необходимости печатается:
Help on function x in module __main__:
x(a, b=23)
Some doc for x.
(END)