Смотрите на эти , осматривают модуль - это сделает контроль различных свойств объектов кода для Вас.
>>> 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 низшего уровня.
Я думаю, то, что вы ищете, это метод locals -
In [6]: def test(a, b):print locals()
...:
In [7]: test(1,2)
{'a': 1, 'b': 2}