7 ответов:
ранее принятый ответ был устаревший по состоянию на
Python 3.0. Вместо того, чтобы использоватьinspect.getargspecтеперь вы должны выбратьSignatureкласс, который заменил его.создание подписи для функции легко с помощью
signatureфункции:from inspect import signature def someMethod(self, arg1, kwarg1=None): pass sig = signature(someMethod)теперь вы можете быстро просмотреть его параметры с помощью
string it:str(sig) # returns: '(self, arg1, kwarg1=None)'или вы также можете получить сопоставление имен атрибутов объекты параметров через
sig.parameters.params = sig.parameters print(params['kwarg1']) # prints: kwarg1=20кроме того, вы можете позвонить
lenonsig.parametersчтобы также увидеть количество аргументов, требуемых этой функцией:print(len(params)) # 3каждая запись в
paramsmapping-это на самом делеParameterобъект это имеет дополнительные атрибуты, что делает вашу жизнь проще. Например, захват параметра и просмотр его значения по умолчанию теперь легко выполняется с помощью:kwarg1 = params['kwarg1'] kwarg1.default # returns: Noneаналогично для остальных объекты, содержащиеся в
parameters.
что касается Python
2.xпользователи, в то время какinspect.getargspecне устарел, язык скоро будет : -). ЭлементSignatureкласс недоступен в2.xсерий и не будет. Так что вам все равно нужно работать сinspect.getargspec.что касается перехода между Python 2 и 3, Если у вас есть код, который опирается на интерфейс
getargspecв Python 2 и переключение наsignaturein3слишком сложно, у вас есть ценная опция С помощьюinspect.getfullargspec. Он предлагает аналогичный интерфейс дляgetargspec(один вызываемый аргумент), чтобы захватить аргументы функции, а также обрабатывать некоторые дополнительные случаи, которыеgetargspecнет:from inspect import getfullargspec def someMethod(self, arg1, kwarg1=None): pass args = getfullargspec(someMethod)С
getargspec,getfullargspecвозвращает aNamedTupleкоторая содержит аргументы.print(args) FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})
import inspect inspect.getargspec(someMethod)посмотреть проверка модуля
someMethod.func_code.co_argcountили, если текущее имя функции не определено:
import sys sys._getframe().func_code.co_argcount
получить имена и значения по умолчанию для аргументов функции. Возвращается кортеж из четырех вещей: (args, varargs, varkw, defaults). args-список имен аргументов (он может содержать вложенные списки). varargs и varkw-это имена аргументов * и ** или нет. defaults-это кортеж значений аргументов по умолчанию или нет, если нет аргументов по умолчанию; если этот кортеж имеет n элементов, они соответствуют последним N элементам перечисленные в args.
изменено в версии 2.6: возвращает именованный кортеж ArgSpec(аргументы, с varargs, ключевые слова, настройки по умолчанию).
посмотреть можно--список--ключевое слово-аргументы-а-питон-функции-получает.
добавляя к вышесказанному, я также видел, что в большинстве случаев функция help() действительно помогает
например, он дает все подробности о аргументах, которые он принимает.
help(<method>)дает ниже
method(self, **kwargs) method of apiclient.discovery.Resource instance Retrieves a report which is a collection of properties / statistics for a specific customer. Args: date: string, Represents the date in yyyy-mm-dd format for which the data is to be fetched. (required) pageToken: string, Token to specify next page. parameters: string, Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2. Returns: An object of the form: { # JSON template for a collection of usage reports. "nextPageToken": "A String", # Token for retrieving the next page "kind": "admin#reports#usageReports", # Th
как показывают другие ответы,
getargspecработает хорошо, пока запрашиваемая вещь на самом деле является функцией. Это не работает для встроенный функции, такие какopen,len, etc, и будет выдавать исключение в таких случаях:TypeError: <built-in function open> is not a Python functionниже функция (вдохновленный ответ) демонстрирует обходной путь. Он возвращает количество аргументов, ожидаемых
f:from inspect import isfunction, getargspec def num_args(f): if isfunction(f): return len(getargspec(f).args) else: spec = f.__doc__.split('\n')[0] args = spec[spec.find('(')+1:spec.find(')')] return args.count(',')+1 if args else 0идея состоит в том, чтобы разобрать спецификацию функции из
__doc__строку. Очевидно, что это зависит от формата указанной строки, поэтому вряд ли является надежным!
проверка.getargspec () для удовлетворения ваших потребностей
from inspect import getargspec def func(a, b): pass print len(getargspec(func).args)
Comments