Учитывая функцию Python:
def a_method(arg1, arg2):
pass
Как я могу извлечь число и названия аргументов. Т.е., учитывая, что у меня есть ссылка на func
, Я хочу func.[something]
возвратиться ("arg1", "arg2")
.
Сценарий использования для этого - то, что у меня есть декоратор, и я хочу использовать аргументы метода в том же порядке, что они появляются для фактической функции как ключ. Т.е. как декоратор посмотрел бы распечатанный "a,b"
когда я звоню a_method("a", "b")
?
Смотрите на эти , осматривают модуль - это сделает контроль различных свойств объектов кода для Вас.
>>> 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)>
Вот что-то, что я думаю, будет работать на то, что Вы хотите, с помощью декоратора.
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.
В CPython количество аргументов
aMethod.func_code.co_argcount
, и их имена находятся в начале
aMethod.func_code.co_varnames
, Это детали реализации CPython, таким образом, это, вероятно, не работает в других реализациях Python, таких как IronPython и Jython.
Один портативный способ допустить аргументы "передачи" состоит в том, чтобы определить Вашу функцию с подписью func(*args, **kwargs)
. Это используется много в, например, matplotlib, куда внешний уровень API передает много аргументов ключевого слова API низшего уровня.