前投稿
デコレーターなんてむずかしいことしないで始めから 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
で受け取れるのも理解しやすいかんじ
いろいろラップしたいときはデコレーターを使ったほうがイイかもですが 勉強になりました