withとか使ってみようとした

機能の存在は知っているけれど、使ったことが無かったので朝の空いた時間に。

# -*- coding: utf-8 -*-

## schemeのparamaterのようなことしようとしたらp.x = yがは文だった。
## print p.x = yとか無理だった。

# need self._value
class Paramaterized(object):
    @property
    def value(self):
        return self._value

    @value.getter
    def value(self):
        return self._value

    @value.setter
    def value(self, n):
        r = self._value 
        self._value = n
        return r

## need self.is_finished
class Notifiable(object):
    def notify(self):
        print "is-finished?: %s" % self.is_finished
    
class Paramater(Paramaterized, Notifiable,  object):
    def __init__(self, n):
        self._value = n

    def __enter__(self):
        self.is_finished = False
        self.notify()
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.is_finished = True
        self.notify()
        fmt = "type:%s,  value:%s,  \ntraceback:%s"
        print(fmt % (exc_type, exc_value, traceback))
        return True # 握りつぶす
        # return False # 再送したければfalse
   

###
    
with Paramater(10) as p:
    print p.value
    p.value = 100
    #print (p.value = 100) # error
    print p.value

with Paramater(10) as p:
    raise Exception("Hey!!")

# is-finished?: False
# 10
# 100
# is-finished?: True
# type:None,  value:None,  
# traceback:None
# is-finished?: False
# is-finished?: True
# type:<type 'exceptions.Exception'>,  value:Hey!!,  
# traceback:<traceback object at 0x7f8a6af19908>

contextlibとかあとで調べる。