Last active
August 29, 2015 14:11
-
-
Save tmr232/46d73eab5ebe63f26739 to your computer and use it in GitHub Desktop.
sys.settrace usage sample
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import inspect | |
class Tracer(object): | |
def __init__(self): | |
self._indentation_level = 0 | |
@property | |
def indentation_level(self): | |
return self._indentation_level | |
@indentation_level.setter | |
def indentation_level(self, value): | |
self._indentation_level = max(0, value) | |
def __enter__(self): | |
sys.settrace(self) | |
def __exit__(self, exc_type, exc_value, traceback): | |
sys.settrace(None) | |
def __call__(self, frame, event, args): | |
frameinfo = inspect.getframeinfo(frame) | |
filename = frameinfo.filename | |
# Use `in` instead of comparing because you need to cover for `.pyc` files as well. | |
if filename in __file__: | |
return None | |
if event == 'return': | |
self.indentation_level -= 1 | |
elif event == 'call': | |
print "{}{}{}".format(" " * self.indentation_level, | |
frameinfo.function, | |
inspect.formatargvalues(*inspect.getargvalues(frame))) | |
self.indentation_level += 1 | |
else: | |
return None | |
return self |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment