Pythonと++(increment)

PythonへJavaやC++のコードをポート(移植)するメリットはほとんど場合、コードが短くなり、シンプルになってアルゴリズムに集中できるからだ。そして高速にテストが出来るためとても便利である。しかも、最近はBlender 3D上でのシュミレーションも可能で実験するのに便利だ(bulletも含め)。ボクは主にAIやPhysicsの分野で役立てている。

で、ポートの際、バグが入ってしまうのは、instanceのコピーや参照、テンプレート(*)やオーバーロードの問題もあるが、簡単なものでは++iという数式がエラーを発生しない問題がある。

javaやC++で以下の行があるとする。
    i=0;
    ++i;
ご存知の通りiは+1されて1になる。

python(2.xや3.x, ボクは現在3.3.2を利用)では。
    i=0;
    ++i;
エラーが表示されず、単にiは0のままになっている。
理由は
+(+i)と認識し、結果的にiが書かれているとpythonは認識するからだ。

正しくは...
   i=0;
   i+=1;
と書くと正常にポートできたことになる。(もちろん;は不要、念の為)
したがって、++iなどがあればi+=1に全て書きなおすことを忘れないようにしなければならない。

最後に、短いコードではすぐにこの手のバグは発見できるが、  数千、数万行単位になると発見しにくいので注意しなければならない。

P.S.
lint(pylint)も役立つと思われる。
例えば以下のようなエラーを表示してくれる。
W:617,12:GameWorld.Render: Statement seems to have no effect
E:617,12:GameWorld.Render: Use of the non-existent ++ operator

参考:
http://stackoverflow.com/questions/1485841/behaviour-of-increment-and-decrement-operators-in-python

*
ついでだが個人的に何度も使わされたことがあるテンプレートは嫌いな機能で複雑になる割にメリットが少ないと思っている。一部の設計者の自己満足的な機能とさえ感じる。pythonでテンプレート部分を移植するとシンプルになり驚く。

コメント

このブログの人気の投稿

日本でコンピュータサイエンスを学ぶ難しさ

How to preview nif file on the ubuntu.