Python3のbool値判定で詰まったお話

お久しぶりです、10ヶ月ぶりにブログ更新します。

たまにはエンジニアっぽい技術ネタを。
や、お仕事でPython (3系) 使ってて簡単なことでえらい悩んだってだけなんですけど。

なにかというと、普段リストや辞書と同等に扱ってるものでも実体は別物なことあるから注意しようね!ってアレです。
軽くググッた感じ同じようなことで詰まってるってページは見当たらなかったんですが、普通はすぐそういうのわかるモノなんですかね…。

まず基本ですが、(Python疎い人も読んでくれるかなーという期待も込めて書いておくと)

print(bool(['a', 'b'])    #True
print(bool([]))           #False

と、リストは中身のあるなしでTrue/Falseの判定ができます。

で、本題として、以下みたいなことをやって小一時間悩みました。

filtered = filter(lambda l: l.isdigit(), ['a', 'b', 'c'])    #filter()で空にすると
print(bool(filtered))          #True←なんでや!!

もちろんホントはもっとややこしいビジネスなロジック書いてたけど、まぁ単純化するとこんな感じ。

なんでや!!


もったいぶらずに結論書きますと、正しい判定したいなら↓のようにやらないとだめ、と。

print(bool(list(filtered)))    #False

つまり、filter()かけたあとのブツはリスト型みたいに使えるけど実体としてはfilter object型になってて、filter object = iterator objectは中身空っぽでもbool値判定したらTrue返るよ!ってことですね…。

いまこれ書いてる環境にPython入ってないから確認できないけど、 たぶんきっとおそらく確実に、辞書型とOrderedDictとかでも同じこと起きるはず。

ひとつ勉強になりました。

あ?Python2ならfilter()でリスト返るって?知ったことかそんな古代語。3を使え3を。


  • 良かったこと: phpとかいうクソ言語おやすみしてpython書いてる。たっのしー!!
  • 悪かったこと: さすがに1年勤めると職場で猫を被りきれなくなってきた。
  • 目標: イカゲーも2が出るらしいしこのブログ名前変えたほうがいいですかね。某OSS目当てで検索かけてココ見に来る人わりといるもんね。