Как я могу найти количество аргументов функции Python? Мне нужно знать, сколько у него нормальных аргументов и сколько именованных аргументов.
Пример:
def someMethod(self, arg1, kwarg1=None):
pass
Этот метод имеет 2 аргумента и 1 именованный аргумент.
inspect
стандартного модуля библиотеки не было бы никакого оправдания .inspect
Модуль имеет много других функций, так что это несправедливо сказать , что весь модуль будет неоправданным , если одна конкретная функция в нем была. Более того, легко увидеть, как эта функция может использоваться плохо. (См. Stackoverflow.com/questions/741950 ). Тем не менее, это полезная функция, особенно для написания декораторов и других функций, которые работают с функцией.Ответы:
Ранее принятый ответ устарел с
Python 3.0
. Вместо использованияinspect.getargspec
вы должны выбратьSignature
класс, который заменил его.Создать подпись для функции легко с помощью
signature
функции :Теперь вы можете быстро просмотреть его параметры, используя
str
его:или вы также можете получить сопоставление имен атрибутов с объектами параметров через
sig.parameters
.Кроме того, вы можете позвонить
len
наsig.parameters
также увидеть количество аргументов этой функции необходимо:Каждая запись в
params
отображении на самом деле являетсяParameter
объектом, который имеет дополнительные атрибуты, облегчающие вашу жизнь. Например, захват параметра и просмотр его значения по умолчанию теперь легко выполняется с помощью:аналогично для остальных объектов, содержащихся в
parameters
.Что касается
2.x
пользователей Python , хотяinspect.getargspec
и не считается устаревшим, язык скоро будет :-).Signature
Класс не доступен в2.x
серии , и не будет. Так что вам все еще нужно работатьinspect.getargspec
.Что касается перехода между Python 2 и 3, если у вас есть код , который опирается на интерфейс
getargspec
в Python 2 и переход кsignature
в3
слишком сложно, у вас есть ценный вариант использованияinspect.getfullargspec
. Он предлагает интерфейс, похожий наgetargspec
(один вызываемый аргумент), чтобы получить аргументы функции, а также обрабатывать некоторые дополнительные случаи, которыеgetargspec
этого не делают:Как и
getargspec
,getfullargspec
возвращает a,NamedTuple
который содержит аргументы.источник
co_argcount
атрибут).getfullargspec
не реализован в Python 2.x, вы должны использоватьgetargspec
getargspec
не работает со встроенными функциями:getargspec(open)
даетTypeError: <built-in function open> is not a Python function
См. этот ответ для некоторых идей ...print(args)
вы не получаете,defaults=(None,)
вы получаетеdefaults=None
.см. модуль проверки
источник
inspect.signature
- docs.python.org/3/library/inspect.html#inspect.signatureили, если текущее имя функции не определено:
источник
dir(someMethod)
->'func_code'
; Идти дальше:dir(someMethod.func_code)
->'co_argcount'
; Вы можете использовать встроенныйdir()
для определения доступных методов объекта.six.get_function_code(someMethod).co_argcount
some_method.__code__.co_argcount
co_argcount
используется внутри во время оценки объекта кода. Я пытаюсь сказать, что на самом деле нет никаких гарантий, что эти атрибуты не изменятся от одного выпуска к другому.inspect.getargspec ()
См. Can-you-list-the-keyword-arguments-a-python-function-receive .
источник
Помимо вышесказанного, я также видел, что в большинстве случаев функция help () действительно помогает
Например, он дает все детали об аргументах, которые он принимает.
дает ниже
источник
help
Функция показывает только то, что говорит строка документации. Вы даже проверяли, работает ли оно с определением функции в вопросе?help()
выплевывает больше, чем просто строку документации - даже на недокументированном коде он по-прежнему печатает argspec и сообщает вам, где был определен код. Человек, который разместил оригинальный вопрос, не знал, нужен ли ему ответ, который был бы машинным или дружественным для человека. Если это только нужно, чтобы быть дружественным к человеку,help()
это вполне адекватно.help()
возвращаемые данные и пытаться найтиargs
иkwargs
.Хорошие новости для людей, которые хотят сделать это портативным способом между Python 2 и Python 3.6+: используйте
inspect.getfullargspec()
метод . Работает как в Python 2.x, так и в 3.6+Как отмечали Джим Фасаракис Хиллиард и другие, раньше это было так:
1. В Python 2.x: использование
inspect.getargspec()
2. В Python 3.x: использование подписи, поскольку
getargspec()
иgetfullargspec()
устарели.Однако, начиная с Python 3.6 (по многочисленным просьбам?), Ситуация изменилась к лучшему:
Со страницы документации Python 3 :
источник
inspect.getargspec () для удовлетворения ваших потребностей
источник
Как предполагают другие ответы,
getargspec
работает хорошо, пока запрашиваемая вещь на самом деле является функцией. Он не работает для встроенных функций, таких какopen
,len
и т. Д., И выдает исключение в таких случаях:Функция ниже (вдохновленная этим ответом ) демонстрирует обходной путь. Возвращает ожидаемое количество аргументов
f
:Идея состоит в том, чтобы разобрать спецификацию функции из
__doc__
строки. Очевидно, что это зависит от формата указанной строки, так что вряд ли является надежным!источник
func.__code__.co_argcount
дает ряд каких - либо аргументов ДО*args
func.__kwdefaults__
дает вам подсказку ключевых аргументов ПОСЛЕ*args
func.__code__.co_kwonlyargcount
равноlen(func.__kwdefaults__)
func.__defaults__
дает значения необязательных аргументов, которые появляются перед*args
Вот простая иллюстрация:
источник
В:
Вне:
Примечание: если xyz не был внутри класса X и не имел «self» и просто «a, b, c», то он напечатал бы 3.
Для python ниже 3.5, вы можете заменить
inspect.getfullargspec
наinspect.getargspec
в коде выше.источник