2012-06-28 15 views
5

Per essere breve, supponiamo di avere una stringa 'next',Come verificare il codice sorgente di un metodo python?

next = "123rpq" 

e posso applicare un metodo .isdigit()str-'next'. Quindi la mia domanda è come verificare l'implementazione di questo metodo. Quindi esiste qualcosa come inspect.getsource(somefunction) per ottenere il codice sorgente di un "metodo"?

AGGIORNAMENTO: vedere il commento sul nome della variabile 'next' di seguito.

+2

Si prega di non chiamare la variabile 'next' perché ombreggia il 'next' incorporato. – Matthias

+0

@ Mattias, grazie. –

risposta

7

Per moduli, classi, funzioni e pochi altri oggetti è possibile utilizzare inspect.getfile o inspect.getsourcefile. Tuttavia, per gli oggetti e i metodi incorporati ciò comporterà uno TypeError. Come indicato da C0deH4cker, gli oggetti e i metodi incorporati sono implementati in C, quindi dovrai sfogliare il codice sorgente C. isdigit è un metodo dell'oggetto stringa incorporato, implementato nel file stringobject.c nella directory Objects del codice sorgente Python. Questo metodo isdigits è implementato dalla riga 3392 di questo file. Vedi anche la mia risposta here a una domanda simile ma più generale.

0

Si può provare a stampare method.__doc__ per la documentazione su quel particolare metodo. Se sei solo curioso, puoi controllare il tuo PYTHONPATH per vedere da dove vengono importati i tuoi moduli e vedere se trovi il file .py da quel modulo

+1

è meglio usare 'help (str.isdigit)' –

+0

@Pablo, grazie. potresti darmi l'esempio usando il caso nella mia domanda; come stampare il codice sorgente per 'next.isdigit()'? –

+0

come ha detto @AshwiniChaudhary, è possibile scrivere aiuto (str.isdigit) o ​​str.isdigit .__ doc__ –

6

Il metodo isdigit() di cui stai parlando è un metodo incorporato di un built-in tipo di dati. Significa che la fonte di questo metodo è scritta in C, non in Python. Se vuoi davvero vedere il codice sorgente di esso, ti suggerisco di andare su http://python.org e scaricare il codice sorgente di Python.

0

Anche se in genere sono d'accordo sul fatto che inspect è una buona risposta, si riduce quando la classe (e quindi il metodo di classe) è stata definita nell'interprete.

Se si utilizza dill.source.getsource da dill, è possibile ottenere l'origine di funzioni e lambda, anche se sono definiti in modo interattivo. Può anche ottenere il codice per i metodi e le funzioni delle classi associati o non definiti definiti in curry ... tuttavia, potresti non essere in grado di compilare quel codice senza il codice dell'oggetto che lo racchiude.

>>> from dill.source import getsource 
>>> 
>>> def add(x,y): 
... return x+y 
... 
>>> squared = lambda x:x**2 
>>> 
>>> print getsource(add) 
def add(x,y): 
    return x+y 

>>> print getsource(squared) 
squared = lambda x:x**2 

>>> 
>>> class Foo(object): 
... def bar(self, x): 
...  return x*x+x 
... 
>>> f = Foo() 
>>> 
>>> print getsource(f.bar) 
def bar(self, x): 
    return x*x+x 

>>> 

Per builtin funzioni o metodi, dill.source non funzionerà ... TUTTAVIA ...

Ancora non potrebbe essere necessario ricorrere all'utilizzo di un editor per aprire il file con il codice sorgente in esso (come suggerito in altre risposte). C'è un nuovo pacchetto chiamato cinspect che pretende di essere in grado di visualizzare la fonte per builtins.

Problemi correlati