目次
はじめに
先日の記事で、
Pythonにおけるロギングの方法を紹介しましたが、
ロギングで一番よく実施するのが、
ある変数名と変数値を出力することです。
例えばPythonで、
あるxという変数があり、その変数の値が100である場合、
通常のprint関数を使うと、
100
と表示されます。
しかし、そのときにはその表示された値がxのものであることを覚えているため、
問題ありませんが、後日アプリケーションのデバックをするときには、
その出力がどの変数であるかはおそらく覚えていないので、
最低では、ログや標準出力には
x = 100
と表示させておきたくなります。
上記のような処理は、プログラミング中には大量にコーディングすることになるので、
できるだけ、簡単にコーディングしたいものです。
そこで、今回は自分がよく使用しているプログラミング言語において、
上記の内容を簡単に実施する方法をまとめておきたいと思います。
Python
Pythonでは、
下記のツイートの通り、Python 3.8から、
f-stringで最後でイコールをつけると
変数名や評価式が表示されます。
おお、評価式をf-stringの中に入れると、評価式そのものが表示されつつ、その結果も表示される。この言語設計者は天才だ。。。また当たり前だけど、numpyのarrayもちゃんと表示される😃 pic.twitter.com/UiFIlWIRgY
— Atsushi Sakai (@Atsushi_twi) 2020年5月9日
Julia
Juliaでは、
こちらもデフォルトの機能として、@showマクロを使うと、
変数名や評価式が結果とともに表示されます。
一方、Juliaでは同じことがshowマクロでできる。こちらもデフォルトの機能。しかも、showマクロは自動的にフォーマットしてくれているみたい。Pythonのnumpyと違って、ベクトルや行列がシンプルにかけるけど、printlnした時と同様、行列の表示が残念だな。。ここは個人的にnumpyの方が好きかも。 pic.twitter.com/mb9sruunX3
— Atsushi Sakai (@Atsushi_twi) 2020年5月9日
Shell script
Shell scriptでは、残念ながらデフォルトでは
このような機能は実装されていないようなので、
下記のようにdubugといった関数を定義することで実現できます。
Shell scriptだと、こんな感じでevalを使ったdebug関数を定義すれば、同じように変数名と変数の値を同時に表示できる。 pic.twitter.com/nb1rjNJQ5F
— Atsushi Sakai (@Atsushi_twi) 2020年5月9日
C++
C++の場合は、
マクロを使えば、変数名と変数の値を簡単に出力できる。
このようなマクロはデフォルトでは、存在しないようなので
Shell scriptと同様、自分で定義する必要あり。
C++の場合はマクロを使えば、変数名と変数の値を簡単に出力できる。このようなマクロはデフォルトでは、存在しないようなのでShell scriptと同様、自分で定義する必要あり。 pic.twitter.com/36E1lNcShH
— Atsushi Sakai (@Atsushi_twi) 2020年5月9日
Java
Javaの場合、
変数というよりクラスのフィールドを表示したくなりますが、
リフレクションを使ってtoStringをオーバライドすることで、
名前と変数を表示させることができます。
Javaの場合、マクロも無いので、
これを全部のクラスでやるのはかなり大変ですが。。
javaの場合、変数というよりクラスのフィールドを表示したくなるけど、リフレクションを使って、toStringをオーバライドすることで、名前と変数を表示させることができた。Javaの場合、マクロも無いので、これを全部のクラスでやると思うと一番めんどくさいかも。。 pic.twitter.com/CWYzHfkqDC
— Atsushi Sakai (@Atsushi_twi) 2020年5月9日
IDEの機能を使う
プログラミング言語の機能だけで、
変数名と変数の値を簡単に出力するのは、
C++やJavaのような静的言語では難しいですが、
そんなときは、IDEの機能を使うことで
簡単にコーディングできるようになります。
例えば、JetbrainsのJava IDEであるInteliJの場合、
入力支援であるLive Template機能の中に、
soutvというテンプレートがあります。
これは、soutvとエディタで入力したあと、
変換ボタンを押すと、変数名を入力するだけで、
変数名と変数を出力するSystem.out.printlnを自動入力してくれます。
Java以外にも、それぞれのIDEで
上記のような入力支援機能を利用することで、
言語自身が対応していなくても、
簡単に変数名と変数値を出力するコードを簡単にコーディングできます。
参考資料
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。