Python 2.x сгенерированные метаклассами обертки - PullRequest
1 голос
/ 12 октября 2011

У меня проблема с тем, что я обернул некоторые методы класса с помощью метакласса, но теперь, если я использую 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

...