概要
iteratorにシグナルを紛れ込ませて、適切なタイミングでアクションをしたい。
カスタムクラスを使って実装する。
内容
環境
macOS Catalina
Python 3.7.0
実演
勝手なclass
を自分で定義して用いる。is
で判定。
class OreShikaTsukawan:
pass
def myiterator():
for i in range(1000):
yield i
if i % 10 == 5:
yield OreShikaTsukawan
for value in myiterator():
if value is OreShikaTsukawan:
print('finish signal!')
break
print(value)
output
0
1
2
3
4
5
finish signal!
こうすれば、本来のiteratorの中身とかぶる心配はない。
変な演算をしてしまう心配も少ない。
蛇足
可能ならばclass
in class
とかすれば、global変数を汚さずに済む。
追記:
自分以外そんなに使っていないだろうと思っていたら、似たような他の例を見つけた。
Lib/functools.py
sentinel = object() # unique object used to signal cache misses
iterator
ではなく、辞書のKeyが存在するかどうかに用いられている。
参考にさせていただいた本・頁
特になし
感想
たまに便利。
今後
同僚に驚かれなければ使っていく。