2016/11/26

[py3]2to3で変換してみよう

作業場にて。。

Aさん「このpython、バージョンは何で書いてるの?」
私「2.7です」
Aさん「3じゃないんだ。。。」

というわけで、そろそろpython3を視野に入れないといかんようだ。

 

python2.7をインストールすると、Tools\Scriptsの中に2to3.pyというスクリプトがある。
これがpython2をpython3に変換してくれるツールらしいので、試してみよう。


print 'Hello! I\'m Python2'


単純すぎで済まん。。。
私が思いつくpython2と3の違いは、printで括弧がいるかどうかなのだ。

これを「python2.py」というファイル名で保存して、2to3にかけてみる。
うちはWindowsで、python2.7はC:\Winappli\Python27というフォルダにインストールしている。


C:\Prog\python\py3test>python C:\Winappli\Python27\Tools\Scripts\2to3.py python2.py
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored python2.py
--- python2.py  (original)
+++ python2.py  (refactored)
@@ -1 +1 @@
-print 'Hello! I\'m Python2'
+print('Hello! I\'m Python2')
RefactoringTool: Files that need to be modified:
RefactoringTool: python2.py


オプションを付けないと、差分だけ表示するが、-wを付けるとファイルに書き込んでくれる。
前のファイルは.bakを付けて残される。


print('Hello! I\'m Python2')


まあ、予想通りの結果だ。
python3で実行しても動く。
めでたしめでたし。

 

ではあるのだが、これをpython2で動かしても、ちゃんと動くのだ。
じゃあ、最初からprintも括弧を付けて書いておけばいいのに、なんでそういうサンプルになっていなかったのだろう?

軽く調べたところ、python2で括弧無しのprintは、passやbreakと同じ「print」というステートメントという扱いらしい。
6. 単純文 (simple statement) — Python 2.7.x ドキュメント

そして、2.7の方で動いたのは組み込み関数のprint()なのだが、これは2.6から追加されているようだ。
2. 組み込み関数 — Python 2.7.x ドキュメント

python2では当初print()関数がなかったから、ステートメントのprintで書いているため、それを見て覚えた人がまたステートメントのprintを使って。。。ということで、脈々と受け継がれたということだろう。

ああ、新参者の私には分からぬ事情であったことだよ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。