Czy mógłbyś rozwinąć swoje konkretne pytanie i może podać przykład z oczekiwanym rezultatem?
jhwist
Prawdopodobnie szuka funkcji w bibliotekach Pythona lub innych firm, która zwróci sygnaturę metody (nazwy i typy parametrów oraz wartość zwracaną) na podstawie nazwy metody.
Michael Petrotta,
1
Podpis jak to nazwać i takie? Spróbuj help(yourmethod)np.help(map)
AttributeError: obiekt „module” nie ma atrybutu „getargspec”
Spì
3
@Spi, wywołujesz inspect.getargspecmoduł, a nie funkcję.
Mike Graham
Dzięki, problem dotyczył Eclipse, które nie
widziało
Jeśli funkcja ma adnotacje argumentów lub argumenty zawierające tylko słowa kluczowe (= jeśli używasz Pythona 3), musisz getfullargspeczamiast tego wywołać . ( ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them)
badp
2
@darth_coder: W Pythonie2, getargspecpodnosi się, TypeErrorjeśli dane wejściowe nie są rozpoznawane jako funkcja Pythona - to znaczy funkcja zaimplementowana w Pythonie. W CPythonie Exception.__init__jest zaimplementowany w C, stąd TypeError. Będziesz musiał sprawdzić kod źródłowy, aby zrozumieć sygnaturę połączenia. W Pythonie3 getargspecjest zaimplementowany inaczej i tam inspect.getargspec(Exception.__init__)zwraca ArgSpecinstancję.
unutbu
44
Prawdopodobnie najłatwiejszym sposobem znalezienia podpisu dla funkcji byłoby 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)
inspect.signaturejest również dostępny dla Pythona 2 za pośrednictwem funcsigsprojektu backport: pypi.python.org/pypi/funcsigs
ncoghlan
14
#! /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")
Może trochę za późno na imprezę, ale jeśli chcesz również zachować kolejność argumentów i ich wartości domyślne , możesz użyć modułu Abstract Syntax Tree (ast) .
Oto dowód słuszności koncepcji (uważaj na kod, aby posortować argumenty i dopasować je do wartości domyślnych, zdecydowanie można ulepszyć / uczynić bardziej przejrzystym):
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
Jeśli próbujesz faktycznie przeanalizować sygnaturę funkcji, użyj argspec modułu inspekcji. Musiałem to zrobić podczas sprawdzania poprawności funkcji skryptu przechwytującego użytkownika w ogólnej strukturze.
help(yourmethod)
np.help(map)
Odpowiedzi:
Należy jednak pamiętać, że
inspect.getargspec()
jest to przestarzałe od wersji Python 3.0.Python 3.0-3.4 zaleca
inspect.getfullargspec()
.Python 3.5+ poleca
inspect.signature()
.źródło
inspect.getargspec
moduł, a nie funkcję.getfullargspec
zamiast tego wywołać . (ValueError: Function has keyword-only arguments or annotations, use getfullargspec() API which can support them
)getargspec
podnosi się,TypeError
jeśli dane wejściowe nie są rozpoznawane jako funkcja Pythona - to znaczy funkcja zaimplementowana w Pythonie. W CPythonieException.__init__
jest zaimplementowany w C, stądTypeError
. Będziesz musiał sprawdzić kod źródłowy, aby zrozumieć sygnaturę połączenia. W Pythonie3getargspec
jest zaimplementowany inaczej i taminspect.getargspec(Exception.__init__)
zwracaArgSpec
instancję.Prawdopodobnie najłatwiejszym sposobem znalezienia podpisu dla funkcji byłoby
help(function)
:Ponadto w Pythonie 3 do
inspect
wywoływanego modułu dodano metodęsignature
, która ma reprezentować sygnaturę wywoływalnego obiektu i jego adnotację zwrotną :źródło
inspect.signature
jest również dostępny dla Pythona 2 za pośrednictwemfuncsigs
projektu backport: pypi.python.org/pypi/funcsigsźródło
def foo(a, *, b:int, **kwargs)
foo(4, b=3.3)
Spróbuj wezwać
help
obiekt, aby się o tym dowiedzieć.źródło
Może trochę za późno na imprezę, ale jeśli chcesz również zachować kolejność argumentów i ich wartości domyślne , możesz użyć modułu Abstract Syntax Tree (ast) .
Oto dowód słuszności koncepcji (uważaj na kod, aby posortować argumenty i dopasować je do wartości domyślnych, zdecydowanie można ulepszyć / uczynić bardziej przejrzystym):
źródło
Jeśli wszystko, co próbujesz zrobić, to wydrukować funkcję, użyj pydoc.
Jeśli próbujesz faktycznie przeanalizować sygnaturę funkcji, użyj argspec modułu inspekcji. Musiałem to zrobić podczas sprawdzania poprawności funkcji skryptu przechwytującego użytkownika w ogólnej strukturze.
źródło
Przykładowy kod:
źródło
Użyj% pdef w wierszu poleceń (IPython), wydrukuje tylko podpis.
na przykład
%pdef np.loadtxt
źródło