2009-05-21 6 views
29
  • Nome del file da cui il codice viene eseguito
  • Nome della classe da cui il codice viene eseguito
  • nome del metodo (attributo della classe) in cui il codice viene eseguito

risposta

31

Ecco un esempio di ciascuno:

from inspect import stack 

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

f = Foo() 
+2

Stai cercando di eseguirlo dalla riga di comando? Ovviamente non è definito allora; prova a creare un file con il codice e facendo il nome del file python - funzionerà come previsto. –

+0

eseguilo dal file – mtasic85

+2

Perché non ispezionare.currentframe? – tzot

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

per il resto sYS e traccia moduli

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

qualche informazione in più: https://mail.python.org/pipermail/python-list/2001-August/096499.html e http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html

volevi per la segnalazione degli errori perché il modulo traceback in grado di gestire che:

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 molto attento. Considerate:

class A: 
    pass 

B = A 
b = B() 

Qual è il 'nome di classe' di b qui? È A o B? Perché?

Il punto è che non dovresti aver bisogno di sapere o preoccuparti. Un oggetto è quello che è: il suo nome è molto raramente utile.

+4

Il nome della classe è 'A' poiché' b' è un'Istanza ** di 'B' che a sua volta è un ** riferimento ** a' A' che è una ** Classe **. – ted

+0

Per gli utenti, sicuramente; ma estremamente utile durante il debug - come per un gestore di eccezioni o simili per segnalare dove si trova. Potresti comporre un bel messaggio di errore per dire la stessa cosa, ma spesso contiene comunque queste informazioni, nel qual caso sembra uno spreco scrivere ogni volta. Inoltre, per creare (ad esempio) un pacchetto di registrazione generale, è estremamente utile essere in grado di fornire questo automaticamente. Se la tua argomentazione è valida, non si applicherebbe altrettanto bene a isinstance(), che sicuramente è importante e utile? – TextGeek