¿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.

183
Georg Schölly 11 may. 2009 a las 16:45

9 respuestas

La mejor respuesta

La respuesta previamente aceptada ha sido en desuso a partir de Python 3.0. En lugar de utilizar inspect.getargspec, ahora debe optar por la clase Signature que la reemplazó.

Crear una firma para la función es fácil a través de la función signature función:

from inspect import signature

def someMethod(self, arg1, kwarg1=None):
    pass

sig = signature(someMethod)

Ahora, puede ver sus parámetros rápidamente al str ing:

str(sig)  # returns: '(self, arg1, kwarg1=None)'

O también puede obtener una asignación de nombres de atributos a objetos de parámetros a través de sig.parameters.

params = sig.parameters 
print(params['kwarg1']) # prints: kwarg1=20

Además, puede llamar a len en sig.parameters para ver también la cantidad de argumentos que requiere esta función:

print(len(params))  # 3

Cada entrada en el mapeo params es en realidad un {{X1} } objeto que tiene más atributos 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:

kwarg1 = params['kwarg1']
kwarg1.default # returns: None

De manera similar para el resto de los objetos contenidos en parameters.


En cuanto a los usuarios de Python 2.x, mientras que inspect.getargspec no está en desuso, el idioma pronto será :-). La clase Signature no está disponible en la serie 2.x y no lo estará. Por lo tanto, aún debe trabajar con inspect.getargspec.

En cuanto a la transición entre Python 2 y 3, si tiene un código que se basa en la interfaz de getargspec en Python 2 y cambiar a signature en 3 es demasiado difícil, lo hace tenga la valiosa opción de usar inspect.getfullargspec. Ofrece una interfaz similar a getargspec (un único argumento invocable) para capturar los argumentos de una función y al mismo tiempo manejar algunos casos adicionales que getargspec no:

from inspect import getfullargspec

def someMethod(self, arg1, kwarg1=None):
    pass

args = getfullargspec(someMethod)

Al igual que con getargspec, getfullargspec devuelve un NamedTuple que contiene los argumentos.

print(args)
FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})
104
Dimitris Fasarakis Hilliard 12 jul. 2017 a las 18:55

inspect.getargspec ()

Obtenga los nombres y los valores predeterminados de los argumentos de una función. Se devuelve una tupla de cuatro cosas: (args, varargs, varkw, valores predeterminados). args es una lista de nombres de argumentos (puede contener listas anidadas). varargs y varkw son los nombres de los argumentos * y ** o Ninguno. valores predeterminados es una tupla de valores de argumento predeterminados o Ninguno si no hay argumentos predeterminados; si esta tupla tiene n elementos, corresponden a los últimos n elementos listados en args.

Modificado en la versión 2.6: Devuelve una tupla ArgSpec con nombre (args, varargs, palabras clave, valores predeterminados).

Consulte can-you-list-the-keyword-argumentos -a-función-pitón-recibe.

16
Community 23 may. 2017 a las 12:10

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.

help(<method>)

Da lo siguiente

method(self, **kwargs) method of apiclient.discovery.Resource instance
Retrieves a report which is a collection of properties / statistics for a specific customer.

Args:
  date: string, Represents the date in yyyy-mm-dd format for which the data is to be fetched. (required)
  pageToken: string, Token to specify next page.
  parameters: string, Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.

Returns:
  An object of the form:

    { # JSON template for a collection of usage reports.
    "nextPageToken": "A String", # Token for retrieving the next page
    "kind": "admin#reports#usageReports", # Th
5
Venu Murthy 31 oct. 2013 a las 12:29

En:

import inspect 

class X:
    def xyz(self, a, b, c): 
        return 

print(len(inspect.getfullargspec(X.xyz).args))

Fuera:

4


Nota: Si xyz no estuviera dentro de la clase X y no tuviera "self" y solo "a, b, c", hubiera impreso 3.

Para python por debajo de 3.5, es posible que desee reemplazar inspect.getfullargspec por inspect.getargspec en el código anterior.

0
Guillaume Chevalier 19 feb. 2020 a las 10:35

Inspect.getargspec () para satisfacer sus necesidades

from inspect import getargspec

def func(a, b):
    pass
print len(getargspec(func).args)
3
Eds_k 30 sep. 2018 a las 08:48

Buenas noticias para las personas que desean hacer esto de forma portátil entre Python 2 y Python 3.6+: use el método inspect.getfullargspec(). Funciona tanto en Python 2.xy 3.6+

Como Jim Fasarakis Hilliard y otros han señalado, solía ser así:
1. En Python 2.x: use inspect.getargspec()
2. En Python 3.x: use la firma, ya que getargspec() y getfullargspec() quedaron 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 :

inspect.getfullargspec (func)

Cambiado en la versión 3.6 : Este método se documentó previamente como obsoleto a favor de signature() en Python 3.5, pero esa decisión se ha revertido para restaurar una interfaz estándar claramente compatible para fuente única Código Python 2/3 que migra fuera de la API getargspec() heredada.

4
blackbrandt 17 jun. 2019 a las 19:36
import inspect
inspect.getargspec(someMethod)

Vea el módulo de inspección

116
Jochen Ritzel 11 may. 2009 a las 12:49

Como sugieren otras respuestas, getargspec funciona bien siempre que lo que se esté consultando sea en realidad una función. No funciona para funciones incorporadas como open, len, etc., y arrojará una excepción en tales casos:

TypeError: <built-in function open> is not a Python function

La siguiente función (inspirada en esta respuesta) muestra una solución alternativa. Devuelve el número de argumentos esperado por f:

from inspect import isfunction, getargspec
def num_args(f):
  if isfunction(f):
    return len(getargspec(f).args)
  else:
    spec = f.__doc__.split('\n')[0]
    args = spec[spec.find('(')+1:spec.find(')')]
    return args.count(',')+1 if args else 0

La idea es analizar la especificación de la función de la cadena __doc__. Obviamente, esto se basa en el formato de dicha cadena, por lo que no es robusto.

1
Community 23 may. 2017 a las 12:03
someMethod.func_code.co_argcount

O, si el nombre de la función actual es indeterminado:

import sys

sys._getframe().func_code.co_argcount
29
miaoever 23 ago. 2013 a las 02:58