# An attempt to emulate scope guard statements of the D Programming Language
# see: http://d...content-available-to-author-only...s.com/2.0/statement.html#ScopeGuardStatement
def noop(*args, **kwargs):
pass
def mkCbAdder(typ):
def adder(self, cb):
self.callbacks.append( (typ, cb) )
return adder
class Scope(object):
def __init__(self):
self.callbacks = []
exit = property(noop, mkCbAdder('exit'))
success = property(noop, mkCbAdder('ok'))
failure = property(noop, mkCbAdder('fail'))
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
ok = value is None
while self.callbacks:
typ, cb = self.callbacks.pop()
if typ is 'exit':
cb()
elif ok and typ is 'ok':
cb()
elif not ok and (typ is 'fail'):
cb()
def write(arg):
return lambda: print(arg, end="")
write(1)()
with Scope() as s:
write(2)()
s.exit = write(3)
s.exit = write(4)
write(5)()
# 12543
print()
with Scope() as s:
s.exit = write(1)
s.success = write(2)
s.exit = write(3)
s.success = write(4)
# 4321
print()
try:
with Scope() as s:
s.exit = write(1)
s.success = write(2)
s.failure = write(3)
raise Exception("msg")
s.exit = write(4)
s.success = write(5)
s.failure = write(6)
except Exception as e:
pass
# 31
IyBBbiBhdHRlbXB0IHRvIGVtdWxhdGUgc2NvcGUgZ3VhcmQgc3RhdGVtZW50cyBvZiB0aGUgRCBQcm9ncmFtbWluZyBMYW5ndWFnZQojIHNlZTogaHR0cDovL2QuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnMuY29tLzIuMC9zdGF0ZW1lbnQuaHRtbCNTY29wZUd1YXJkU3RhdGVtZW50CgpkZWYgbm9vcCgqYXJncywgKiprd2FyZ3MpOgogICAgcGFzcwoKZGVmIG1rQ2JBZGRlcih0eXApOgogICAgZGVmIGFkZGVyKHNlbGYsIGNiKToKICAgICAgICBzZWxmLmNhbGxiYWNrcy5hcHBlbmQoICh0eXAsIGNiKSApCiAgICByZXR1cm4gYWRkZXIKCmNsYXNzIFNjb3BlKG9iamVjdCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuY2FsbGJhY2tzID0gW10KCiAgICBleGl0ID0gcHJvcGVydHkobm9vcCwgbWtDYkFkZGVyKCdleGl0JykpCiAgICBzdWNjZXNzID0gcHJvcGVydHkobm9vcCwgbWtDYkFkZGVyKCdvaycpKQogICAgZmFpbHVyZSA9IHByb3BlcnR5KG5vb3AsIG1rQ2JBZGRlcignZmFpbCcpKQoKICAgIGRlZiBfX2VudGVyX18oc2VsZik6CiAgICAgICAgcmV0dXJuIHNlbGYKCiAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CiAgICAgICAgb2sgPSB2YWx1ZSBpcyBOb25lCiAgICAgICAgd2hpbGUgc2VsZi5jYWxsYmFja3M6CiAgICAgICAgICAgIHR5cCwgY2IgPSBzZWxmLmNhbGxiYWNrcy5wb3AoKQogICAgICAgICAgICBpZiB0eXAgaXMgJ2V4aXQnOgogICAgICAgICAgICAgICAgY2IoKQogICAgICAgICAgICBlbGlmIG9rIGFuZCB0eXAgaXMgJ29rJzoKICAgICAgICAgICAgICAgIGNiKCkKICAgICAgICAgICAgZWxpZiBub3Qgb2sgYW5kICh0eXAgaXMgJ2ZhaWwnKToKICAgICAgICAgICAgICAgIGNiKCkKCgpkZWYgd3JpdGUoYXJnKToKICAgIHJldHVybiBsYW1iZGE6IHByaW50KGFyZywgZW5kPSIiKQoKCndyaXRlKDEpKCkKd2l0aCBTY29wZSgpIGFzIHM6CiAgICB3cml0ZSgyKSgpCiAgICBzLmV4aXQgPSB3cml0ZSgzKQogICAgcy5leGl0ID0gd3JpdGUoNCkKICAgIHdyaXRlKDUpKCkKCiMgMTI1NDMKCnByaW50KCkKCndpdGggU2NvcGUoKSBhcyBzOgogICAgcy5leGl0ID0gd3JpdGUoMSkKICAgIHMuc3VjY2VzcyA9IHdyaXRlKDIpCiAgICBzLmV4aXQgPSB3cml0ZSgzKQogICAgcy5zdWNjZXNzID0gd3JpdGUoNCkKCiMgNDMyMQoKcHJpbnQoKQoKdHJ5OgogICAgd2l0aCBTY29wZSgpIGFzIHM6CiAgICAgICAgcy5leGl0ID0gd3JpdGUoMSkKICAgICAgICBzLnN1Y2Nlc3MgPSB3cml0ZSgyKQogICAgICAgIHMuZmFpbHVyZSA9IHdyaXRlKDMpCiAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJtc2ciKQogICAgICAgIHMuZXhpdCA9IHdyaXRlKDQpCiAgICAgICAgcy5zdWNjZXNzID0gd3JpdGUoNSkKICAgICAgICBzLmZhaWx1cmUgPSB3cml0ZSg2KQogICAgICAgIApleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICBwYXNzCgojIDMxCg==