Как я могу получить аргументы для любого метода Python? - PullRequest
1 голос
/ 22 сентября 2011

Обычно я бы использовал inspect.getargspec, однако как я могу получить аргументы метода, который был связан?

Например, как я могу получить имена аргументов для метода 'foo' следующим образом:

class Foo(object):

    @memoized
    def foo(self, arg1, arg2):
        pass

Обратите внимание, что Foo (). Foo - это запоминаемый объект, http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

Это означает, что это действительно экземпляр functools.partial.

Как сделатьЯ получаю исходную функцию или, альтернативно, получаю аргументы как-нибудь?

Если я не могу, это указывает на недостаток дизайна PythonDecoratorLibrary?

1 Ответ

2 голосов
/ 22 сентября 2011

Вы можете добавить атрибут _wrapped в партиал, который может быть тем, что вы уже сделали:

def __get__(self, obj, objtype):
    """Support instance methods."""
    f = functools.partial(self.__call__, obj)
    f._wrapped = self.func
    return f

Или вы можете вернуть self.func вместо партиала, если obj равен None (то есть, если к нему обращаются из класса, а не из экземпляра):

def __get__(self, obj, objtype):
    """Support instance methods."""
    if obj is None:
        return self.func
    else:
        return functools.partial(self.__call__, obj) 

Атрибут func частичного является методом __call__ помеченного объекта. Если вы вызываете его из экземпляра Foo, то первый аргумент устанавливается в экземпляр obj частичным (см. Это в Foo (). Foo.args). Затем в memoized.__call__ self.func (* args) работает как метод связывания бедного человека.

Для lru_cache Рэймонд Хеттингер имеет Python 2-совместимые реализации, доступные как Рецепты кода ActiveState . Существует также версия для наименее часто используемых, в дополнение к наименее часто используемым.

...