けったいなBugとの闘い | とりあえず、できるといってみよう!

けったいなBugとの闘い

今日私が前に作った機能をさくっとテストしてみたら、どうも動きがおかしい。あれ?と思って調べていくと、あるオプションがFalseにもかかわらず、なぜか実行されている。

ソースをみるとこんな感じ(python)

if test_flag:
print 'OK!'
else:
print 'NG!'


<注:pythonがわかる読者の方へ(そんなひといるのか?): pythonはインデント(字下げ)が大事なんですが、アメブロで書いたらさくっとスペース消されちゃったのであきらめました。ま、雰囲気で読んでください。>

デフォルトの値はtest_flagはFalseにしてるはずなのに、実行すると 'OK!' と表示されてしまう。

ちゃんと初期化されてないのかなあ?とおもって、ソースを以下のように変更して実行。

print test_flag
if test_flag:
print 'OK!'
else:
print 'NG!'

結果:

False
OK!

うげー、なんでだー。

さらに変更

print test_flag
if test_flag:
print test_flag
print 'OK!'
else:
print 'NG!'

False
False
OK!

うぎゃー。パニック。

オプションを明示的に与えてみたところ、

# python program1 --no_test_flag

False
NG!

うわー。同じFalseなのにこっちはFalseだー。でも、なんかここに鍵があるのは間違いない。

~~~~~赤いきつねを食べながら1時間経過~~~~

ふと、なにかのきっかけで FalseがほんとにFalseか?幻じゃないか?と思い立ち、

print type(test_flag)
if test_flag:
print 'OK!'
else:
print 'NG!'

としたら、

<type 'str'> (文字列)とのこと。どひゃーー。

ソースをたどっていくと、設定ファイルからパラメータを読み込む際、Falseというのを文字列でもってきたままBoolean(真偽値)に変更していなかったら起きたBugでした。

よくみると昔のパラメータはちゃんとBooleanに変換してる。私が書いた時に参考にしたウッチーのソースがBugの始まりでした。やっぱ、ウッチーは。。って、人のせいにしてちゃだめで、ちゃんと理解せずに真似して書いた私が悪い。。

とにかく頭がぱにくった数時間でした。

初めてほんとにプログラミングブログっぽいことを書いたなー。内容は低レベルだけど。。