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