Раніше прийнята відповідь застаріла станом на 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
стандартного модуля бібліотеки не було б ніякого виправдання .