Получение названий параметра метода в Python

Учитывая функцию Python:

def a_method(arg1, arg2):
    pass

Как я могу извлечь число и названия аргументов. Т.е., учитывая, что у меня есть ссылка на func, Я хочу func.[something] возвратиться ("arg1", "arg2").

Сценарий использования для этого - то, что у меня есть декоратор, и я хочу использовать аргументы метода в том же порядке, что они появляются для фактической функции как ключ. Т.е. как декоратор посмотрел бы распечатанный "a,b" когда я звоню a_method("a", "b")?

214
задан Boris 13 September 2019 в 05:06
поделиться

3 ответа

Смотрите на эти , осматривают модуль - это сделает контроль различных свойств объектов кода для Вас.

>>> inspect.getfullargspec(aMethod)
(['arg1', 'arg2'], None, None, None)

другими результатами является название *args и ** kwargs переменные и обеспеченные значения по умолчанию. т.е.

>>> def foo(a,b,c=4, *arglist, **keywords): pass
>>> inspect.getfullargspec(foo)
(['a', 'b', 'c'], 'arglist', 'keywords', (4,))

Примечание, что некоторый callables не может быть introspectable в определенных реализациях Python. Например, в CPython, некоторые встроенные функции, определенные в C, не обеспечивают метаданных о своих аргументах. В результате Вы получите ValueError в случае, который Вы используете inspect.getfullargspec() со встроенной функцией.

Начиная с Python 3.3, можно использовать также inspect.signature () для знания подписи вызова вызываемого объекта:

>>> inspect.signature(foo)
<Signature (a, b, c=4, *arglist, **keywords)>
328
ответ дан Boris 23 November 2019 в 04:23
поделиться

Вот что-то, что я думаю, будет работать на то, что Вы хотите, с помощью декоратора.

class LogWrappedFunction(object):
    def __init__(self, function):
        self.function = function

    def logAndCall(self, *arguments, **namedArguments):
        print "Calling %s with arguments %s and named arguments %s" %\
                      (self.function.func_name, arguments, namedArguments)
        self.function.__call__(*arguments, **namedArguments)

def logwrap(function):
    return LogWrappedFunction(function).logAndCall

@logwrap
def doSomething(spam, eggs, foo, bar):
    print "Doing something totally awesome with %s and %s." % (spam, eggs)


doSomething("beans","rice", foo="wiggity", bar="wack")

Выполнение это, это приведет к следующему выводу:

C:\scripts>python decoratorExample.py
Calling doSomething with arguments ('beans', 'rice') and named arguments {'foo':
 'wiggity', 'bar': 'wack'}
Doing something totally awesome with beans and rice.
13
ответ дан hlzr 23 November 2019 в 04:23
поделиться

В CPython количество аргументов

aMethod.func_code.co_argcount

, и их имена находятся в начале

aMethod.func_code.co_varnames

, Это детали реализации CPython, таким образом, это, вероятно, не работает в других реализациях Python, таких как IronPython и Jython.

Один портативный способ допустить аргументы "передачи" состоит в том, чтобы определить Вашу функцию с подписью func(*args, **kwargs). Это используется много в, например, matplotlib, куда внешний уровень API передает много аргументов ключевого слова API низшего уровня.

98
ответ дан Boris 23 November 2019 в 04:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: