2009-05-21 9 views
29
  • Nom du fichier à partir duquel le code est en cours d'exécution
  • Nom de la classe de l'endroit où le code est en cours d'exécution
  • Nom de la méthode (attribut de la classe) où le code est en cours d'exécution

Répondre

31

Voici un exemple de chaque:

from inspect import stack 

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

f = Foo() 
+2

Essayez-vous de l'exécuter à partir de la ligne de commande? Il n'est évidemment pas défini alors; essayez de créer un fichier avec le code et de faire le nom de fichier python - cela fonctionnera comme prévu. –

+0

exécutez-le à partir du fichier – mtasic85

+2

Pourquoi ne pas inspecter.currentframe? – tzot

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

pour le reste des modules de sys et oligo-

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

Quelques infos: https://mail.python.org/pipermail/python-list/2001-August/096499.html et http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html

avez-vous le voulez pour les rapports d'erreur, car le module de retraçage peut gérer que:

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

Soyez très attention. Considérez:

class A: 
    pass 

B = A 
b = B() 

Quel est le 'nom de classe' de b ici? Est-ce A, ou B? Pourquoi? Le fait est que vous ne devriez pas avoir besoin de savoir ou de vous en soucier. Un objet est ce qu'il est: son nom est très rarement utile.

+4

Le nom de la classe est 'A' puisque' b' est une ** Instance ** de 'B' qui à son tour est une ** référence ** à' A' qui est une ** Classe **. – ted

+0

Pour les utilisateurs finaux, sûrement; mais extrêmement utile lors du débogage - comme pour un gestionnaire d'exception ou similaire à signaler où il se trouve. Vous pourriez composer un message d'erreur gentil pour dire la même chose, mais il aurait fréquemment cette information dedans de toute façon, dans ce cas il semble une perte de le taper chaque fois. Aussi, pour construire (par exemple) un paquet de journalisation général, il est extrêmement utile de pouvoir le fournir automatiquement. Si votre argument était valable, cela ne s'appliquerait-il pas aussi bien à isinstance(), ce qui est certainement important et utile? – TextGeek

Questions connexes