Py3k はまだ下位互換性を捨てながら進化するべきじゃないか
http://gihyo.jp/dev/serial/01/pythonhacks/0006
format()メソッドはこの演算子を置き換える目的があり追加された機能です。%演算子は,近い将来廃止されることが予告されています。
Python 3.0.1 (r301:69556, Feb 16 2009, 16:14:21) [GCC 4.3.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import logging >>> logging.warn("foo%s%d", "bar", 38) WARNING:root:foobar38 >>> logging.warn("foo{0}{1}", "bar", 38) Traceback (most recent call last): File "/opt/Python-3.0.1/lib/python3.0/logging/__init__.py", line 749, in emit msg = self.format(record) File "/opt/Python-3.0.1/lib/python3.0/logging/__init__.py", line 633, in format return fmt.format(record) File "/opt/Python-3.0.1/lib/python3.0/logging/__init__.py", line 421, in format record.message = record.getMessage() File "/opt/Python-3.0.1/lib/python3.0/logging/__init__.py", line 291, in getMessage msg = msg % self.args TypeError: not all arguments converted during string formatting
いきなり捨てるのではなくて、最初のうちは % の方を使っていたら deprecated warning でも出して、緩やかに移行するんだろうなぁ。
でも、まだ Python3.0 を地雷除去班専用にしておいて、3.2 くらいまでは下位互換性を捨てながらpy3kの完成系を目指すべきだと思う。標準ライブラリが大きいのはPythonの魅力でもあるんだけど、py3kの場合は言語と標準ライブラリの整合性がまだとれてない部分があちこちにある。
他にも、 bytearray には bytes と同じメソッドが用意されてるけど、 .upper() とかのメソッドは全部 immutable オブジェクト前提の設計を引きずっていて、 in-place メソッドが少ないとか、惜しい部分が多い。