2012-07-05 17 views
6

Estoy tratando de averiguar los argumentos de un método recuperado de un módulo. Encontré un módulo inspect con una función práctica, getargspec. Funciona para una función que defino, pero no funcionará para las funciones de un módulo importado.Python inspect.getargspec con la función integrada

import math, inspect 
def foobar(a,b=11): pass 
inspect.getargspec(foobar) # this works 
inspect.getargspec(math.sin) # this doesn't 

voy a conseguir un error como este:

File "C:\...\Python 2.5\Lib\inspect.py", line 743, in getargspec 
    raise TypeError('arg is not a Python function') 
TypeError: arg is not a Python function 

Es inspect.getargspec diseñado sólo para las funciones locales o estoy haciendo algo mal?

+1

sí, está diseñado de esta manera, consulte http://bugs.python.org/issue1748064 – georg

Respuesta

11

Es imposible obtener este tipo de información para una función que se implementa en C en lugar de Python.

La razón de esto es que no hay forma de averiguar qué argumentos acepta el método excepto mediante el análisis de la cadena de documentos (forma libre) ya que los argumentos se pasan de una manera similar a getarg, es decir, es imposible averigüe qué argumentos acepta sin ejecutar realmente la función.

+0

Bien, estoy volviendo a esto. Entonces, ¿hay alguna manera sucia de hacerlo? Si requiere llamar a la función, está bien. – PeetWc

+0

** No **, realmente no. Solo puedes forzar algunos argumentos donde llamar a la función no genera una excepción. Pero eso no es útil, ni siquiera sabría si hay algunos argumentos opcionales que no intentó, etc. – ThiefMaster

+0

Alrite. Gracias. Necesito encontrar otra manera. – PeetWc

1

Puede obtener la cadena de documentación para funciones/métodos que casi siempre contienen el mismo tipo de información que getargspec. (Es decir, nombres de parámetros, número de parámetros, valores opcionales, valores predeterminados).

En su ejemplo

import math 
math.sin.__doc__ 

Da

"sin(x) 

Return the sine of x (measured in radians)" 

Por desgracia hay varias normas diferentes en operación. Consulte What is the standard Python docstring format?

Puede detectar cuál de los estándares está en uso y luego tomar la información de esa manera. Desde el enlace de arriba, parece que pyment podría ser útil para hacer justamente eso.

Cuestiones relacionadas