Metaclass Recipe: Automatic Debugger Methods¶
Step 1¶
For now, let’s not worry about invoking the debugger. We’ll start by printing a traceback whenever an error occurs. For that, we’ll use a decorator function called get_debugger_func
, which is already defined for you.
Your task is to define the __debugger__
metaclass.
import inspect, traceback, pdb
def get_debugger_func(func):
def new_func(*args):
try:
return func(*args)
except:
traceback.print_exc()
return new_func
class __debugger__(type):
"""Define this class"""
class Example:
__metaclass__ = __debugger__
def divide(self, v):
# exception if v == 0
result = 100 / v
return result
def interpolate(self, *args):
# exception if len(args) != 2
result = "%s is %s!" % args
return result
if __name__ == '__main__':
e = Example()
print e.divide(0)
print '-'*80
print e.interpolate('Feihong', 'very', 'cool')
Expected output:
Traceback (most recent call last):
File "D:\Projects\PyCon 2008 Talks\framework-tutorial\src\metaclass\debugger\solutions\debugger1.py", line 9, in new_func
return func(*args)
File "D:\Projects\PyCon 2008 Talks\framework-tutorial\src\metaclass\debugger\solutions\debugger1.py", line 29, in divide
result = 100 / v
ZeroDivisionError: integer division or modulo by zero
None
--------------------------------------------------------------------------------
Traceback (most recent call last):
File "D:\Projects\PyCon 2008 Talks\framework-tutorial\src\metaclass\debugger\solutions\debugger1.py", line 9, in new_func
return func(*args)
File "D:\Projects\PyCon 2008 Talks\framework-tutorial\src\metaclass\debugger\solutions\debugger1.py", line 34, in interpolate
result = "%s is %s!" % args
TypeError: not all arguments converted during string formatting
None
>>>
Solution: solutions/debugger1.py