2012-06-28 13 views
5

Para ser breve, supongamos que tengo una cadena 'next',¿Cómo verificar el código fuente de un método python?

next = "123rpq" 

y puedo aplicar un método .isdigit()str a 'next'. Entonces mi pregunta es cómo verificar la implementación de este método. ¿Hay algo así como inspect.getsource(somefunction) para obtener el código fuente de un 'método'?

ACTUALIZACIÓN: vea el comentario sobre el nombre de la variable 'next' a continuación.

+2

Por favor, no llame a su variable 'next' porque sombrea el siguiente 'siguiente'. – Matthias

+0

@Matthias, gracias. –

Respuesta

7

Para módulos, clases, funciones y algunos otros objetos puede usar inspect.getfile o inspect.getsourcefile. Sin embargo, para objetos y métodos integrados esto dará como resultado un TypeError. Como se mencionó en C0deH4cker, los objetos y métodos integrados se implementan en C, por lo que tendrá que navegar por el código fuente de C. isdigit es un método del objeto de cadena incorporado, que se implementa en el archivo stringobject.c en el directorio Objects del código fuente de Python. Este método isdigits se implementa desde la línea 3392 de este archivo. Ver también mi respuesta here a una pregunta similar pero más general.

0

Puede intentar imprimir method.__doc__ para obtener la documentación sobre ese método en particular. Si usted es sólo curiosidad, podrías comprobar PYTHONPATH para ver dónde están sus módulos son importados de, y ver si encuentra el archivo .py de ese módulo

+1

es mejor usar 'help (str.isdigit)' –

+0

@Pablo, gracias. podría darme el ejemplo usando el caso en mi pregunta; cómo imprimir el código fuente para 'next.isdigit()'? –

+0

como @AshwiniChaudhary dijo, podrías escribir help (str.isdigit) o ​​str.isdigit .__ doc__ –

6

El método isdigit() que está hablando es un método incorporado de una orden interna del tipo de datos. Es decir, la fuente de este método está escrita en C, no en Python. Si realmente desea ver el código fuente del mismo, entonces le sugiero que vaya al http://python.org y descargue el código fuente de Python.

0

Aunque generalmente estoy de acuerdo en que inspect es una buena respuesta, no se cumple cuando tu clase (y por lo tanto el método de clase) se definió en el intérprete.

Si usa dill.source.getsource desde dill, puede obtener la fuente de funciones y lambdas, incluso si se definen de forma interactiva. También puede obtener el código de métodos y funciones de clase enlazados o no definidos definidos en curries ... sin embargo, es posible que no pueda compilar ese código sin el código del objeto adjunto.

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

>>> 

Para builtin funciones o métodos, dill.source no va a funcionar ... Sin embargo ...

Todavía no tenga que recurrir a usar su editor favorito para abrir el archivo con el código fuente en el mismo (como se sugiere en Otras respuestas). Hay un nuevo paquete llamado cinspect que pretende poder ver el código fuente para builtins.

Cuestiones relacionadas