Quantxでのprintデバッグを便利にしてみる


こんにちは、イナズマです。今日はQuantxのアルゴリズム…ではなく、アルゴリズムを作成する際のデバッグを便利にするtipsを紹介していきたいと思います。
初心者の方でもわかるよう、プログラムも軽く解説したいと思います。

Quantxでのデバッグについて

Quantxではprint関数が使えません。代わりにctx.logger.debug()という関数が提供されています。この関数は引数をログに出力してくれます。この画像の下部の「ログ」という部分に出力されています。
だいたいprint関数と同じですね。

ctx.logger.debugの不便なところ

個人的にこの関数にいくつか不便なところを感じたので改善を試みよう、というのが今回の記事です。

関数名が長い

ctx.logger.debugって長くないですか?printだとたった5文字です!!ということでprintsという関数を定義してしまいましょう。(printという名前でも動くのですが、組み込み関数の方のprintとかぶってしまうため一応printsという名前で定義します)

# prints関数をhandle_signals内で利用する場合はhandle_signals内で定義する。
def handle_signals(ctx, date, current):
    def prints(arg):
        ctx.logger.debug(arg)

    # 下に処理が続く
# 使い方
prints(変数名)

こうすればprintsでログに出力できるようになります。引数は当然、文字列でも数値でも辞書でもなんでも大丈夫です!!

handle_signals内でprints関数を使う分にはこれで問題ないのですが、initialize関数内で利用する場合はinitialize関数内でも定義する必要があります。

任意の数の引数を渡したい!!

組み込み関数であるprintは、複数の引数を与えた場合、空白で区切って表示してくれます。

print(1, 'abc', -3.5)

出力

1 abc -3.5

ctx.logger.debugでも複数の引数を与えたらすべて表示してほしいですよね!ということで任意の数の引数(可変長引数)を受け取れるようにしてみます。定義する場所は、先程と同じところです。

定義

# *を使うと可変長引数を受け取れる。引数はtuple型。
def prints(*args):
    for i in args:
        ctx.logger.debug(i)

使い方

prints(1, 'abc', -4.3) # 任意の個数の引数を与える

まんまprint関数と同じですね。

出力

(handle_signals関数は日ごとに何度も呼び出されるため何度も出力されます。)

余談

余談ですがctx.logger.debugに複数の引数を与えてもなにも出力されません。(されないはずです…)エラーもでません。
なので、ctx.logger.debug(*args)のような記述ではうまくいかないはずです。
なにか知ってる人いましたら教えてください。

変数ごとに改行が入るのは嫌だ!!

さて、現状のprints関数では複数の引数を渡した場合、それぞれが改行されて出力されてしまいます。(上の出力の画像参照)
改行区切りではなく、空白区切りで出力したい方は次のようにprints関数を書き換えてみましょう!!

def prints(*args):
    # tupleのすべての要素にstr()を適用し、文字列型にする。
    str_args = map(str, args)
    # 文字列型が要素のオブジェクトの要素すべてを空白区切りで連結する。
    s = ' '.join(str_args)
    ctx.logger.debug(s)

出力

def prints(*args):
    ctx.logger.debug(' '.join(map(str, args)))

やってることは変わってません。最終的には、こんな感じの自作prints関数を僕は使っています。有用に感じたらぜひ使ってみてください!!(ちなみにですが、この関数のデメリットとしてコードが数行長くなることと、日毎に関数を定義し直されるので処理が多少重くなるかも知れないです>_<)
それではまた。