Preguntas sobre soluciones estáticas. Aquí hay uno dinámico. Supongamos que ejecuta el código y ve una impresión errónea o escribe en sys.stdout, y desea saber de dónde proviene. Puede reemplazar sys.stdout y dejar que la excepción de rastreo ayuda que:
>>> import sys
>>> def go():
... sys.stdout = None
... print "Hello!"
...
>>> go()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in go
AttributeError: 'NoneType' object has no attribute 'write'
>>> print "Here"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'write'
>>>
Para algo un poco más sofisticado, reemplace 'sys.stdout' con algo que depende donde se encuentra la declaración de impresión. Utilizaré traceback.print_stack() para mostrar la pila completa, pero puede hacer otras cosas como usar sys._getframe() para buscar un nivel de pila para obtener el número de línea y el nombre del archivo.
import sys
import traceback
class TracePrints(object):
def __init__(self):
self.stdout = sys.stdout
def write(self, s):
self.stdout.write("Writing %r\n" % s)
traceback.print_stack(file=self.stdout)
sys.stdout = TracePrints()
def a():
print "I am here"
def b():
a()
b()
Aquí está la salida
Writing 'I am here'
File "stdout.py", line 19, in <module>
b()
File "stdout.py", line 17, in b
a()
File "stdout.py", line 14, in a
print "I am here"
File "stdout.py", line 9, in write
traceback.print_stack(file=self.stdout)
Writing '\n'
File "stdout.py", line 19, in <module>
b()
File "stdout.py", line 17, in b
a()
File "stdout.py", line 14, in a
print "I am here"
File "stdout.py", line 9, in write
traceback.print_stack(file=self.stdout)
Si usted va esta ruta, consulta el módulo 'linecache', que se puede utilizar para imprimir el contenido de la línea. Eche un vistazo a la implementación de traceback.print_stack para obtener detalles sobre cómo hacerlo.
¿Qué editor de texto y sistema operativo ...? –
Uso de Pydev en Eclipse – Casebash
El establecimiento de un tracefunc lo activará para todas las llamadas, sin importar cómo se escribieron. – Geo