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でテンプレート部分を移植するとシンプルになり驚く。
で、ポートの際、バグが入ってしまうのは、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でテンプレート部分を移植するとシンプルになり驚く。
コメント
コメントを投稿