Как я могу найти количество аргументов функции Python?



Как я могу найти количество аргументов функции Python? Мне нужно знать, сколько нормальных аргументов и именованных аргументов.



пример:



def someMethod(self, arg1, kwarg1=None):
pass


этот метод имеет 2 аргумента и 1 именованный аргумент.

510   7  

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

кроме того, вы можете позвонить len on sig.parameters чтобы также увидеть количество аргументов, требуемых этой функцией:

print(len(params))  # 3

каждая запись в params mapping-это на самом деле 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 и переключение на signature in 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={})
import inspect
inspect.getargspec(someMethod)

посмотреть проверка модуля

someMethod.func_code.co_argcount

или, если текущее имя функции не определено:

import sys

sys._getframe().func_code.co_argcount

проверка.getargspec ()

получить имена и значения по умолчанию для аргументов функции. Возвращается кортеж из четырех вещей: (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

    Ничего не найдено.