¿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.
inspect
módulo de biblioteca estándar.inspect
mó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 laSignature
clase que la reemplazó.Crear una firma para la función es fácil a través de la
signature
función :Ahora, puede ver sus parámetros rápidamente al
str
hacerlo:o también puede obtener una asignación de nombres de atributos a objetos de parámetros mediante
sig.parameters
.Además, puede llamar
len
asig.parameters
ver también el número de argumentos Esta función requiere:Cada entrada en el
params
mapeo es en realidad unParameter
objeto 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.x
usuarios de Python , aunqueinspect.getargspec
no está en desuso, el idioma pronto será :-). LaSignature
clase no está disponible en la2.x
serie 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
getargspec
Python 2 y el cambio asignature
en3
que 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 quegetargspec
no:Al igual que con
getargspec
,getfullargspec
devuelve unNamedTuple
que contiene los argumentos.fuente
co_argcount
atributo)getfullargspec
no está implementado en Python 2.x, debe usarlogetargspec
getargspec
no funciona en funciones incorporadas:getargspec(open)
daTypeError: <built-in function open> is not a Python function
Ver 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_argcount
some_method.__code__.co_argcount
co_argcount
se 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
help
La 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 elargs
ykwargs
.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,
getargspec
funciona 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_argcount
le da el número de los argumentos ANTES*args
func.__kwdefaults__
le da un resumen de los argumentos de palabras clave DESPUÉS*args
func.__code__.co_kwonlyargcount
es igual alen(func.__kwdefaults__)
func.__defaults__
le da los valores de argumentos opcionales que aparecen antes*args
Aquí 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.getfullargspec
porinspect.getargspec
el código de seguridad.fuente