2009-05-21 17 views
29
  • Nombre del archivo desde donde el código se está ejecutando
  • Nombre de la clase de donde el código se está ejecutando
  • Nombre del método (atributo de la clase) donde el código se está ejecutando

Respuesta

31

Aquí es un ejemplo de cada uno:

from inspect import stack 

class Foo: 
    def __init__(self): 
     print __file__ 
     print self.__class__.__name__ 
     print stack()[0][3] 

f = Foo() 
+2

¿Está tratando de ejecutarlo desde la línea de comandos? Obviamente no está definido entonces; intente crear un archivo con el código y hacer el nombre de archivo python; funcionará como se espera. –

+0

ejecútelo desde el archivo – mtasic85

+2

¿Por qué no inspeccionar.currentframe? – tzot

5
self.__class__.__name__ # name of class i'm in 

para el resto de los módulos sys y traza

http://docs.python.org/library/sys.html http://docs.python.org/library/trace.html

algo más de información: https://mail.python.org/pipermail/python-list/2001-August/096499.html y http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html

querías que para el informe de errores ya que el módulo de rastreo puede con eso:

http://docs.python.org/library/traceback.html

9
import sys 

class A: 
    def __init__(self): 
     print __file__ 
     print self.__class__.__name__ 
     print sys._getframe().f_code.co_name 

a = A() 
4

Be muy cuidado. Considere:

class A: 
    pass 

B = A 
b = B() 

¿Cuál es el 'nombre de clase' de b aquí? ¿Es A o B? ¿Por qué?

El punto es que no debería necesitar saber o preocuparse. Un objeto es lo que es: su nombre rara vez es útil.

+4

El nombre de clase es 'A' ya que' b' es ** Instancia ** de 'B' que a su vez es ** referencia ** a' A' que es ** Clase **. – ted

+0

Para usuarios finales, seguramente; pero extremadamente útil cuando se depura, como para un manejador de excepciones o similar para informar dónde está. Podría redactar un bonito mensaje de error para decir lo mismo, pero a menudo incluiría esta información de todos modos, en cuyo caso parece una pérdida escribirlo cada vez. Además, para construir (por ejemplo) un paquete de registro general, es inmensamente útil poder proporcionarlo automáticamente. Si su argumento se sostuvo, ¿no se aplicaría también a isinstance(), que seguramente es importante y útil? – TextGeek

Cuestiones relacionadas