Ранее принятый ответ устарел с Python 3.0
. Вместо использования inspect.getargspec
вы должны выбрать Signature
класс, который заменил его.
Создать подпись для функции легко с помощью signature
функции :
from inspect import signature
def someMethod(self, arg1, kwarg1=None):
pass
sig = signature(someMethod)
Теперь вы можете быстро просмотреть его параметры, используя str
его:
str(sig) # returns: '(self, arg1, kwarg1=None)'
или вы также можете получить сопоставление имен атрибутов с объектами параметров через sig.parameters
.
params = sig.parameters
print(params['kwarg1']) # prints: kwarg1=20
Кроме того, вы можете позвонить len
на sig.parameters
также увидеть количество аргументов этой функции необходимо:
print(len(params)) # 3
Каждая запись в params
отображении на самом деле является Parameter
объектом, который имеет дополнительные атрибуты, облегчающие вашу жизнь. Например, захват параметра и просмотр его значения по умолчанию теперь легко выполняется с помощью:
kwarg1 = params['kwarg1']
kwarg1.default # returns: None
аналогично для остальных объектов, содержащихся в parameters
.
Что касается 2.x
пользователей Python , хотя inspect.getargspec
и не считается устаревшим, язык скоро будет :-). Signature
Класс не доступен в 2.x
серии , и не будет. Так что вам все еще нужно работать inspect.getargspec
.
Что касается перехода между Python 2 и 3, если у вас есть код , который опирается на интерфейс getargspec
в Python 2 и переход к signature
в 3
слишком сложно, у вас есть ценный вариант использования inspect.getfullargspec
. Он предлагает интерфейс, похожий на getargspec
(один вызываемый аргумент), чтобы получить аргументы функции, а также обрабатывать некоторые дополнительные случаи, которые getargspec
этого не делают:
from inspect import getfullargspec
def someMethod(self, arg1, kwarg1=None):
pass
args = getfullargspec(someMethod)
Как и getargspec
, getfullargspec
возвращает a, NamedTuple
который содержит аргументы.
print(args)
FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})
inspect
стандартного модуля библиотеки не было бы никакого оправдания .