そろそろpy3k対応も考えないといけないようなので、2to3.pyを試しに使ってみました。
まだまだ手作業がいるなあ、と思ったところをメモ。
・「for i in map(...)」というのを、「for in list(map(...))」に直してくれるのですが、ちょっと安全側に倒しすぎでは?と感じます。
・py3kでは、__eq__は__eq__から自動的に作ってくれる(__eq__が定義してあれば「... != ...」のを「not( ... == ...)」と解釈してくれる)のですが、__ne__が定義されていても警告してくれません。
・「print x, y」を「print(x, y)」にしてくれるのですが、前者でスペースが入ることを期待していると、後者は出ないので注意。
・途中までpy3kに直したソースファイルにもう一度2to3.pyを実行すると、余分な処理を付け加えてくれる。「print(a)」を「print((a))」にしてくれたり。
・型を追いかけてくれないので、open(..., "rb")で読み込んだ内容にたいして正規表現のマッチングをしているところでエラーになる。
(python 2.Xでは、読み込んだ内容はstrになるので、reでマッチングできるが、3ではbytesになるのでエラー)
・上記も含めて、str/unicodeとbytes/strのまわりは自分でやらないといけません。「unicode("abc", "shift_jis")」は「str("abc", "shift_jis")」と直訳されてしまいますが、もちろんエラーになります。
ということで、2と3の違いを理解していないと使えないなー、という感じ。
まあここまで自動化してくれたのはうれしいですけれど。
まだまだ手作業がいるなあ、と思ったところをメモ。
・「for i in map(...)」というのを、「for in list(map(...))」に直してくれるのですが、ちょっと安全側に倒しすぎでは?と感じます。
・py3kでは、__eq__は__eq__から自動的に作ってくれる(__eq__が定義してあれば「... != ...」のを「not( ... == ...)」と解釈してくれる)のですが、__ne__が定義されていても警告してくれません。
・「print x, y」を「print(x, y)」にしてくれるのですが、前者でスペースが入ることを期待していると、後者は出ないので注意。
・途中までpy3kに直したソースファイルにもう一度2to3.pyを実行すると、余分な処理を付け加えてくれる。「print(a)」を「print((a))」にしてくれたり。
・型を追いかけてくれないので、open(..., "rb")で読み込んだ内容にたいして正規表現のマッチングをしているところでエラーになる。
(python 2.Xでは、読み込んだ内容はstrになるので、reでマッチングできるが、3ではbytesになるのでエラー)
・上記も含めて、str/unicodeとbytes/strのまわりは自分でやらないといけません。「unicode("abc", "shift_jis")」は「str("abc", "shift_jis")」と直訳されてしまいますが、もちろんエラーになります。
ということで、2と3の違いを理解していないと使えないなー、という感じ。
まあここまで自動化してくれたのはうれしいですけれど。