例外処理

  • try
  • except
  • else
  • finally
    • 例外発生有無にかかわらず最後に実行される。
>>> def fetch(obj, i):
...     try:
...             print(obj[i])
...     except IndexError:
...             print("IndexError")
...     else:
...             print("else")
...     finally:
...             print("finally")
...
>>> fetch([1,2,3], 1)
2
else
finally
>>> fetch([1,2,3], 5)
IndexError
finally

__getattr__と__setattr__

>>> class wrapper:
...     def __init__(self, object):
...             self.wrapped = object
...     def __getattr__(self, attrname):
...             print("Trace", attrname)
...             return getattr(self.wrapped, attrname)
...
>>> lst = wrapper([1,2,3])
>>> lst.append(4)
Trace append
>>> lst.wrapped
[1, 2, 3, 4]

関数デコレータ

.NETのCustomAttributeに近い印象。

>>> class Tracer:
...     def __init__(self, func):
...             self.cnt = 0
...             self.func = func
...     def __call__(self, *args):
...             self.cnt += 1
...             print(self.cnt)
...             self.func(*args)
...
>>> @Tracer
... def spam(a, b, c):
...     print(a, b, c)
...
>>> spam(1, 2, 3)
1
1 2 3