前投稿

デコレーターなんてむずかしいことしないで始めから contextmanager をつかっていればよかったんだ……
yo.py
from contextlib import contextmanager
import random
class Prot:
def __init__(self):
pass
@contextmanager
def yoyo(self, hey):
print('gacha.') # __enter__
yield hey # as
print('Everything Done Right.') # __exit__
def yo_gacha(self, y):
yo = [y*i for i in range(10)]
return yo[random.randint(0, 9)]
if __name__ == '__main__':
p = Prot()
with p.yoyo('hey') as y:
print(p.yo_gacha(y))
contextlib.contextmanager は with をイイ感じに適用してくれるデコレーターで yield をはさんで __enter__ と __exit__ にわけてくれます
インデントがひとつ犠牲になるけど記述も楽だしとてもわかりやすい
yield で渡すと as で受け取れるのも理解しやすいかんじ
いろいろラップしたいときはデコレーターを使ったほうがイイかもですが 勉強になりました