pe氏mmbotEvent監視殴り書きメモ2

続き

class ChildOrderEventWatcher(EventWatcher):
    def __init__(self, store, order_id, **kwargs):
        self._order_id = order_id
        self._cond = kwargs
        super(ChildOrderEventWatcher, self).__init__(store)

    def _is_trigger(self, d):
        return d["child_order_acceptance_id"] == self._order_id and all(
            [v == d[k] for (k, v) in self._cond.items()]
        )

    def replace_order_id(self, order_id):
        self._order_id = order_id

子クラスを実装してる
子クラスとかよくわからないから調べてみる

あるクラスを定義する際に親となるクラスを指定すると、そのクラスの機能をまるごと引き継ぐことが可能となりますが、この機能のことを継承と呼びます

https://www.python.ambitious-engineer.com/archives/312

とりあえず、親クラスを変更することなく、親クラスにある機能に追加したりすることができるらしい

super(ChildOrderEventWatcher, self).__init__(store)

親クラスのことをスーパークラスとか呼んだりもするらしい
このsuperは親クラスのコンストラクタを呼び出すことができる

また、この書き方はpython2の書き方?っぽい

superの後のクラス名はいらないのかな?よくわからない
消したりして試してみる

initで定義してる**kwargsについてしらべてみる

関数定義で引数に*と**(1個または2個のアスタリスク)をつけると、任意の数の引数(可変長引数)を指定できる。

**kwargs: 複数のキーワード引数を辞書として受け取る

https://note.nkmk.me/python-args-kwargs-usage/

辞書として引数を受け取るときに使うらしい

def _is_trigger(self, d):
        return d["child_order_acceptance_id"] == self._order_id and all(
            [v == d[k] for (k, v) in self._cond.items()]
        )

引数dはソケットメッセ―ジ
child_order_acceptance_idは注文の受付 ID

all()について調べる

all()は引数に指定したイテラブルオブジェクトの要素がすべてTrueと判定されるとTrueを返す。一つでもFalseがあればFalse。

https://note.nkmk.me/python-all-any-usage/

allの中身を見てみる

[v == d[k] for (k, v) in self._cond.items()]

itemsについて調べる

各要素のキーkeyと値valueの両方に対してforループ処理を行いたい場合は、items()メソッドを使う。

https://note.nkmk.me/python-dict-keys-values-items/

この場合だとvalueと辞書のキーを参照した場合の値が同じだとTrue、それをforでまわすことで、すべての値が同じかどうかを判断してる
すべてが同じ場合はallによってTrueが返される

class ExecutionWatcher(ChildOrderEventWatcher):
    def __init__(self, store, order_id):
        super().__init__(store, order_id, event_type="EXECUTION")

childordereventwatcherの子クラスで、引数としてevent_type=EXECUTIONを
受け取ってる。約定したときにつかうのかな?確認する

class CancelWatcher(ChildOrderEventWatcher):
    def __init__(self, store, order_id):
        super().__init__(store, order_id)

    def _is_trigger(self, d):
        return d["child_order_acceptance_id"] == self._order_id and d["event_type"] in [
            "CANCEL",
            "CANCEL_FAILED",
        ]

キャンセルイベント監視にかんしても同様。
注文idがキャンセルなのかどうかを判定

ここまできてやっとis_triggerが監視をしてbool値判定しているものだと気づきました。このtriggerに基づいてなにかしらの処理をしていくんだなぁ。すごい

とりあえず、イベント監視に関してプログラミング初心者が調べながら流し読み終了します。

もし暇な人でここ多分違うぞとかあったら教えてください。

いいなと思ったら応援しよう!