У меня проблема с тем, что я обернул некоторые методы класса с помощью метакласса, но теперь, если я использую help (), встроенные методы отображаются как обертка вместо исходного метода.
# Example:
class MetaBuilderModule(type):
@staticmethod
def time_method(method):
@functools.wraps(method)
def __wrapper(self, *args, **kwargs):
if self.__timingstatus__[method.__name__]:
return method(self, *args, **kwargs)
else:
# Set the timing status of the method to True so that we don't
# time any inherited methods.
self.__timingstatus__[method.__name__] = True
start = time.time()
finish = None
result = None
# Put the result behind a try / except so that if we get an error
# within the method we can still reset the timing status.
try:
result = method(self, *args, **kwargs)
except Exception:
exc_type, exc_value, exc_traceback = sys.exc_info()
traceback.print_exception(exc_type, exc_value, exc_traceback)
self.__timingstatus__[method.__name__] = False
return False
finish = time.time()
sys.stdout.write('Instance method \'%s\' of BuilderModule class'
' took %0.3fs to execute.\n' %(method.__name__, (finish - start)))
# Reset the timing status.
self.__timingstatus__[method.__name__] = False
return result
return __wrapper
def __new__(cls, name, bases, attrs):
# Create the __timingstatus__ dictionary that helps stop timers being
# triggered by inherited methods.
attrs['__timingstatus__'] = dict()
for attr in ['__init__', 'run']:
attrs['__timingstatus__'][attr] = False
if not attr in attrs:
continue
attrs[attr] = cls.time_method(attrs[attr])
return super(MetaBuilderModule, cls).__new__(cls, name, bases, attrs)
Как вы можете видеть, я добавил декоратор @ functools.wraps в метод __wrapper, чтобы, по крайней мере, я получил правильное имя метода, но я все еще не получил правильные аргументы.
Example:
| Methods defined here:
|
| __init__(self, *args, **kwargs)
Я видел несколько статей, предлагающих исправление обезьяны inspect.getargspec , но я не вижу в этом практического решения.
У кого-нибудь есть другая черная магия, которую они могли бы предложить?
Приветствия
CB