Не могли бы вы уточнить свой конкретный вопрос и, возможно, привести пример с ожидаемым результатом?
jhwist
Предположительно он ищет функциональные возможности в Python или сторонних библиотеках, которые будут возвращать подпись метода (имена и типы параметров и возвращаемое значение) с учетом имени метода.
Майкл Петротта,
1
Подпись как в как его называть и тому подобное? Попробуйте, help(yourmethod)например,help(map)
AttributeError: объект 'module' не имеет атрибута 'getargspec'
Spì
3
@Spi, вы вызываете inspect.getargspecмодуль, а не функцию.
Майк Грэм,
Спасибо, проблема была в Eclipse, который не видел модуль проверки
Spì
Если функция имеет аннотации аргументов или аргументы только по ключевым словам (= если вы используете Python 3), вы должны getfullargspecвместо этого вызвать . ( ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them)
badp
2
@darth_coder: в Python2 getargspecподнимается, TypeErrorесли ввод не распознается как функция Python, то есть функция, реализованная в Python. В CPython Exception.__init__реализован на C, поэтому TypeError. Вам нужно будет проверить исходный код, чтобы понять подпись вызова. В Python3 getargspecреализовано иначе, и там inspect.getargspec(Exception.__init__)возвращается ArgSpecэкземпляр.
unutbu 04
44
Возможно, самый простой способ найти сигнатуру функции help(function):
>>>def function(arg1, arg2="foo",*args,**kwargs):pass>>> help(function)Help on function function in module __main__:
function(arg1, arg2='foo',*args,**kwargs)
#! /usr/bin/env pythonimport inspect
from collections import namedtuple
DefaultArgSpec= namedtuple('DefaultArgSpec','has_default default_value')def _get_default_arg(args, defaults, arg_index):""" Method that determines if an argument has default value or not,
and if yes what is the default value for the argument
:param args: array of arguments, eg: ['first_arg', 'second_arg', 'third_arg']
:param defaults: array of default values, eg: (42, 'something')
:param arg_index: index of the argument in the argument array for which,
this function checks if a default value exists or not. And if default value
exists it would return the default value. Example argument: 1
:return: Tuple of whether there is a default or not, and if yes the default
value, eg: for index 2 i.e. for "second_arg" this function returns (True, 42)
"""ifnot defaults:returnDefaultArgSpec(False,None)
args_with_no_defaults = len(args)- len(defaults)if arg_index < args_with_no_defaults:returnDefaultArgSpec(False,None)else:
value = defaults[arg_index - args_with_no_defaults]if(type(value)is str):
value ='"%s"'% value
returnDefaultArgSpec(True, value)def get_method_sig(method):""" Given a function, it returns a string that pretty much looks how the
function signature would be written in python.
:param method: a python method
:return: A string similar describing the pythong method signature.
eg: "my_method(first_argArg, second_arg=42, third_arg='something')"
"""# The return value of ArgSpec is a bit weird, as the list of arguments and# list of defaults are returned in separate array.# eg: ArgSpec(args=['first_arg', 'second_arg', 'third_arg'],# varargs=None, keywords=None, defaults=(42, 'something'))
argspec = inspect.getargspec(method)
arg_index=0
args =[]# Use the args and defaults array returned by argspec and find out# which arguments has defaultfor arg in argspec.args:
default_arg = _get_default_arg(argspec.args, argspec.defaults, arg_index)if default_arg.has_default:
args.append("%s=%s"%(arg, default_arg.default_value))else:
args.append(arg)
arg_index +=1return"%s(%s)"%(method.__name__,", ".join(args))if __name__ =='__main__':def my_method(first_arg, second_arg=42, third_arg='something'):passprint get_method_sig(my_method)# my_method(first_argArg, second_arg=42, third_arg="something")
Возможно, немного опоздал на вечеринку, но если вы также хотите сохранить порядок аргументов и их значения по умолчанию , вы можете использовать модуль абстрактного синтаксического дерева (ast) .
Вот доказательство концепции (остерегайтесь кода для сортировки аргументов и сопоставления их со значениями по умолчанию, безусловно, можно улучшить / сделать более понятным):
import ast
for class_ in[c for c in module.body if isinstance(c, ast.ClassDef)]:for method in[m for m in class_.body if isinstance(m, ast.FunctionDef)]:
args =[]if method.args.args:[args.append([a.col_offset, a.id])for a in method.args.args]if method.args.defaults:[args.append([a.col_offset,'='+ a.id])for a in method.args.defaults]
sorted_args = sorted(args)for i, p in enumerate(sorted_args):if p[1].startswith('='):
sorted_args[i-1][1]+= p[1]
sorted_args =[k[1]for k in sorted_args ifnot k[1].startswith('=')]if method.args.vararg:
sorted_args.append('*'+ method.args.vararg)if method.args.kwarg:
sorted_args.append('**'+ method.args.kwarg)
signature ='('+', '.join(sorted_args)+')'print method.name + signature
Если вы пытаетесь проанализировать сигнатуру функции, используйте argspec модуля проверки. Мне пришлось сделать это при проверке функции сценария перехвата пользователя в общей структуре.
help(yourmethod)
например,help(map)
Ответы:
Однако обратите внимание, что
inspect.getargspec()
это устарело, начиная с Python 3.0.Python 3.0--3.4 рекомендует
inspect.getfullargspec()
.Python 3.5+ рекомендует
inspect.signature()
.источник
inspect.getargspec
модуль, а не функцию.getfullargspec
вместо этого вызвать . (ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them
)getargspec
поднимается,TypeError
если ввод не распознается как функция Python, то есть функция, реализованная в Python. В CPythonException.__init__
реализован на C, поэтомуTypeError
. Вам нужно будет проверить исходный код, чтобы понять подпись вызова. В Python3getargspec
реализовано иначе, и тамinspect.getargspec(Exception.__init__)
возвращаетсяArgSpec
экземпляр.Возможно, самый простой способ найти сигнатуру функции
help(function)
:Кроме того, в Python 3 к
inspect
вызываемому модулю был добавлен методsignature
, который предназначен для представления сигнатуры вызываемого объекта и его аннотации возврата :источник
inspect.signature
также доступен для Python 2 черезfuncsigs
проект backport: pypi.python.org/pypi/funcsigsисточник
def foo(a, *, b:int, **kwargs)
сfoo(4, b=3.3)
Попробуйте позвонить
help
объекту, чтобы узнать об этом.источник
Возможно, немного опоздал на вечеринку, но если вы также хотите сохранить порядок аргументов и их значения по умолчанию , вы можете использовать модуль абстрактного синтаксического дерева (ast) .
Вот доказательство концепции (остерегайтесь кода для сортировки аргументов и сопоставления их со значениями по умолчанию, безусловно, можно улучшить / сделать более понятным):
источник
Если все, что вы пытаетесь сделать, это распечатать функцию, используйте pydoc.
Если вы пытаетесь проанализировать сигнатуру функции, используйте argspec модуля проверки. Мне пришлось сделать это при проверке функции сценария перехвата пользователя в общей структуре.
источник
Пример кода:
источник
Используйте% pdef в командной строке (IPython), он напечатает только подпись.
например
%pdef np.loadtxt
источник