¿Cómo puedo encontrar el número de argumentos de una función de Python? Necesito saber cuántos argumentos normales tiene y cuántos argumentos nombrados.
Ejemplo:
def someMethod(self, arg1, kwarg1=None):
pass
Este método tiene 2 argumentos y 1 argumento con nombre.

inspectmódulo de biblioteca estándar.inspectmódulo tiene muchas otras características, por lo que es injusto decir que todo el módulo no estaría justificado si una función en particular lo fuera. Además, es fácil ver cómo esta característica podría usarse mal. (Consulte stackoverflow.com/questions/741950 ). Dicho esto, es una característica útil, especialmente para escribir decoradores y otras funciones que funcionan en función.Respuestas:
La respuesta previamente aceptada ha quedado en desuso a partir de
Python 3.0. En lugar de usarinspect.getargspec, ahora debe optar por laSignatureclase que la reemplazó.Crear una firma para la función es fácil a través de la
signaturefunción :Ahora, puede ver sus parámetros rápidamente al
strhacerlo:o también puede obtener una asignación de nombres de atributos a objetos de parámetros mediante
sig.parameters.Además, puede llamar
lenasig.parametersver también el número de argumentos Esta función requiere:Cada entrada en el
paramsmapeo es en realidad unParameterobjeto que tiene atributos adicionales que te hacen la vida más fácil. Por ejemplo, tomar un parámetro y ver su valor predeterminado ahora se realiza fácilmente con:de manera similar para el resto de los objetos contenidos en
parameters.En cuanto a los
2.xusuarios de Python , aunqueinspect.getargspecno está en desuso, el idioma pronto será :-). LaSignatureclase no está disponible en la2.xserie y no lo estará. Así que aún necesitas trabajar con ellosinspect.getargspec.En cuanto a la transición entre Python 2 y 3, si tiene código que se basa en la interfaz de
getargspecPython 2 y el cambio asignatureen3que es demasiado difícil, usted tiene la opción valiosa de utilizarinspect.getfullargspec. Ofrece una interfaz similar agetargspec(un único argumento invocable) para obtener los argumentos de una función y al mismo tiempo manejar algunos casos adicionales quegetargspecno:Al igual que con
getargspec,getfullargspecdevuelve unNamedTupleque contiene los argumentos.fuente
co_argcountatributo)getfullargspecno está implementado en Python 2.x, debe usarlogetargspecgetargspecno funciona en funciones incorporadas:getargspec(open)daTypeError: <built-in function open> is not a Python functionVer esta respuesta para algunas ideas ...print(args)haces no obtienes lodefaults=(None,)que obtienesdefaults=None.ver el módulo de inspección
fuente
inspect.signature- docs.python.org/3/library/inspect.html#inspect.signatureo, si el nombre de la función actual es indeterminado:
fuente
dir(someMethod)->'func_code'; Ir más allá:dir(someMethod.func_code)->'co_argcount'; Puede usar el incorporadodir()para determinar los métodos disponibles de un objeto.six.get_function_code(someMethod).co_argcountsome_method.__code__.co_argcountco_argcountse usa internamente durante la evaluación del objeto de código. Lo que estoy tratando de decir es que realmente no hay garantías de que estos atributos no cambien de una versión a otra.inspect.getargspec ()
Ver can-you-list-the-keyword-argumentos-a-python-function-recibir .
fuente
Además de lo anterior, también he visto que la mayoría de las veces la función help () realmente ayuda
Por ejemplo, da todos los detalles sobre los argumentos que toma.
da lo siguiente
fuente
helpLa función solo muestra lo que dice la cadena de documentación. ¿Has probado si funciona con la definición de función en la pregunta?help()escupe más que solo la cadena de documentación: incluso en el código no documentado, todavía imprime la especificación args y le dice dónde se definió el código. La persona que publicó la pregunta original no tenía claro si necesitaban una respuesta que fuera amigable con las máquinas o los humanos. Si solo necesita ser amigable con los humanos,help()es perfectamente adecuado.help()regrese e intentar encontrar elargsykwargs.Buenas noticias para las personas que desean hacer esto de forma portátil entre Python 2 y Python 3.6+: use
inspect.getfullargspec()método. Funciona tanto en Python 2.xy 3.6+Como Jim Fasarakis Hilliard y otros han señalado, que solía ser la siguiente manera:
1. En Python 2.x: Uso
inspect.getargspec()2. En Python 3.x: el uso de la firma, como
getargspec()ygetfullargspec()estaban en desuso.Sin embargo, comenzando Python 3.6 (¿por demanda popular?), Las cosas han cambiado hacia mejores:
Desde la página de documentación de Python 3 :
fuente
inspect.getargspec () para satisfacer sus necesidades
fuente
Como sugieren otras respuestas,
getargspecfunciona bien siempre que lo que se esté consultando sea en realidad una función. No funciona para una función de funciones tales comoopen,len, etc, y se producirá una excepción en estos casos:La siguiente función (inspirada en esta respuesta ) muestra una solución alternativa. Devuelve el número de args esperado por
f:La idea es analizar la especificación de la función fuera de la
__doc__cadena. Obviamente, esto se basa en el formato de dicha cadena, por lo que no es robusto.fuente
func.__code__.co_argcountle da el número de los argumentos ANTES*argsfunc.__kwdefaults__le da un resumen de los argumentos de palabras clave DESPUÉS*argsfunc.__code__.co_kwonlyargcountes igual alen(func.__kwdefaults__)func.__defaults__le da los valores de argumentos opcionales que aparecen antes*argsAquí está la ilustración simple:
fuente
En:
Fuera:
Nota: Si xyz no estuviera dentro de la clase X y no tuviera "self" y solo "a, b, c", entonces habría impreso 3.
Para pitón por debajo de 3,5, es posible que desee reemplazar
inspect.getfullargspecporinspect.getargspecel código de seguridad.fuente