読者です 読者をやめる 読者になる 読者になる

methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

Py3k はまだ下位互換性を捨てながら進化するべきじゃないか

Python

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 メソッドが少ないとか、惜しい部分が多い。