2012-07-05 13 views
6

Sto cercando di capire gli argomenti di un metodo recuperato da un modulo. Ho trovato un modulo inspect con una comoda funzione, getargspec. Funziona per una funzione che definisco, ma non funzionerà per le funzioni di un modulo importato.Python inspect.getargspec con funzione integrata

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

prendo un errore come questo:

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 

è inspect.getargspec progettata solo per le funzioni locali o sto facendo qualcosa di sbagliato?

+1

sì, è stato progettato in questo modo, vedi http://bugs.python.org/issue1748064 – georg

risposta

11

È impossibile ottenere questo tipo di informazioni per una funzione implementata in C anziché in Python.

La ragione di questo è che non c'è modo di scoprire quali argomenti il ​​metodo accetta se non per l'analisi del (a forma libera) docstring in quanto argomenti sono passati in un modo (un po ') getarg simile - cioè è impossibile scoprire quali argomenti accetta senza eseguire effettivamente la funzione.

+0

Ok, ci sto tornando. Quindi c'è anche un modo tutto sporco per farlo. Se è necessario chiamare la funzione, va bene. – PeetWc

+0

** No **, non proprio. Potresti solo applicare una forza maggiore ad alcuni argomenti dove chiamare la funzione non genera un'eccezione. Ma non è molto utile - non sapresti nemmeno se ci sono alcuni argomenti opzionali che non hai provato ecc. – ThiefMaster

+0

Alrite. Grazie. Devo trovare un altro modo. – PeetWc

1

È possibile ottenere la stringa doc per tali funzioni/metodi che contiene quasi sempre lo stesso tipo di informazioni di getargspec. (I nomi dei parametri, numero di parametri, quelli facoltativi, valori predefiniti).

Nel tuo esempio

import math 
math.sin.__doc__ 

"sin(x) 

Return the sine of x (measured in radians)" 

Purtroppo ci sono diversi standard di funzionamento. Vedi What is the standard Python docstring format?

È possibile rilevare quale degli standard è in uso e quindi acquisire le informazioni in questo modo. Dal link precedente sembra che pyment potrebbe essere utile per farlo.

Problemi correlati