Python2.6新機能

Python 2.6(Final)が正式リリースされました。

概要:

主にPython3に近づいていくリリースです。600個以上のBUGFIXが行った。

・future_builtinsモジュール:
このモジュールはPython 3で動作が変る2.x関数に関して集まったモジュールです。
Python3と汎用性を保ちたいなら、このモジュールをimportするべきです。
例:
from future_builtins import map, filter
... code using Python 3-style map and filter ...
Python3のprint関数も既にbuiltinsに入れたが、下記をimportしないと3の動作はしません。
from __future__ import print_function
・-3警告:Python3からサポートしない関数に対して、-3警報を表示する。
・multiprocessingモジュール:threadingモジュールを拡張したスーパーモジュールです。
・jsonモジュール:JavaScript Object Notationのパーサです。

Python 3による変化

Python3と2.6の開発はほぼ同時行われているので、3の考え方は2.6に影響を与えている。
Python3から下記の機能を取っている。
・オブジェクトを複数に変換する__complex__()メソッド
・新しい異常のキャッチ方法:except TypeError as exc
・reduce()の同意語としてfunctools.reduce()を追加
Python3から新しいbuiltins関数が追加され、元々存在した関数の動作も調整した。
3の新しいメソッド例えばbin()既に2.6に追加されたが、future_builtinsからimportする必要がある。
 新しいスイッチ「-3」、Python3環境で実行する場合の警告が表示され、
3へ移植する場合どれぐらい作業が発生するかはわかる。
sys.py3kwarningを使用する。Cの場合、Py_Py3kWarningFlagを使用する。
型はBooleanである。
 参考:3xxxのPEPでPython3の提案が含まれている。
PEP3000はPython3の開発フロー、PEP3100はPython3全体像など。

開発フローの変化

 2.6の開発時、Python開発プロセスに大きく変化があった。
 Bug管理はSourceForgeからRoundup、ドキュメントフォーマットはLaTeXからreStructuredTextになった。

PEP343:with

 Python2.5ではwithが追加された(from __future__ import with_statementが必要)。
2.6ではデフォルトで使用可能になった。

PEP366:メインモジュールで明示的な関連import

 -mパラメータでスクリプトモードでモジュールを実行できるが、
Package内部のモジュールを実行する時、うまくいかない場合がある。
 Python2.6では__package__属性を追加し、この属性を使うと、importは__name__と関連しなくなる。

PEP370:site-packageパス

 Python実行時、モジュールのパスsys.pathには「site-package」が含まれている。
これはローカルのユーザ全員がインストールしたモジュールが使用可能にするためである。
 Python2.6から新しいsiteパス。OSによって異なる。
・UnixMacOS:~/.local/
・Windows:%APPDATA%/Python
このパスでバージョン別のフォルダが作られる。例えばUnix/MacOSではlib/python2.6/site-packages、
WindowsではPython2.6/site-packages。
 自分のパスを使用したいなら、環境変数PYTHONUSERBASEを設定する。

PEP371:multiprocessingモジュール

 新しいmultiprocessingモジュールは新しいプロセスを作成し、処理後の結果を親プロセスに渡す。
親プロセスと子プロセス間はキュー・スタックで情報交換や、ロックなどで同期や、データを共有や等ができる。
詳しい情報PEP371を参照すること。

PEP3101:改善された文字列のフォーマット

 Python3では%記号はより強いメソッドformat()で改善された。str.format()はPython2.6にも移植された。
 2.6で、8-bit文字列とUnicode文字列はformat()メソッドを持ち、
文字列をテンプレートとして扱い、パラメータでフォーマットを調整する。
テンプレートは「{ }」を特殊文字として扱う。
例:
# Substitute positional argument 0 into the string.
"User ID: {0}".format("root") -> "User ID: root"

# Use the named keyword arguments
 'User ID: {uid} Last seen: {last_login}'.format(
  uid='root',
  last_login = '5 Mar 2008 07:20') ->
 'User ID: root Last seen: 5 Mar 2008 07:20'
波括弧二回書くとエスケープできる。
辞書例:format("Empty dict: {{}}") -> "Empty dict: {}"
整数を使用すると、パラメータの位置を示す。組み合わせで辞書を値を取得することも出来る。
例:
>>> import sys
>>> 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
'Platform: linux2\nPython version: 2.6 (r26:66714, Oct  2 2008, 18:38:16) \n
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)]'
    
>>> dict = {'name':'Jia Lu'} >>> 'My name is {0[name]}'.format(dict) 'My name is Jia Lu' 注:辞書のキーにシングルクォーテーション「‘’」は必要ない。 整数から始まる文字列は整数に変換されるため、フォーマット対象の文字列に複雑な式は使えない。
コロン「:」を使うことでより正確な位置を表せる。
例:
>>> fmt = '{0:15} ${1:>6}'
>>> fmt.format('Registration', 35)
'Registration    $    35'
組み込みも使用可能
例:fmt = '{0:{1}}'
整列方式を指定可能
<(デフォルト)左整列
>右整列
^中央整列
=(数値のみ)小数点の後ろ補完
更にいくつかの拡張フォーマットがある。
詳しい情報は2.6のドキュメントに参照。
'b' – 二進数
'c' – キャラクタ、整数はUNICODEに変換される
'd' – 十進数
'o' – 八進数
'x' – 十六進数
'e' – 科学記数法
'g' – 一般フォーマット
'n' – 数値数字
'%' – パーセント
例:
>>> '{0:g}'.format(3.75)
 '3.75'
>>> '{0:e}'.format(3.75)
 '3.750000e+00'
クラスと型は__format__()メソッドを定義することでカスタマイズ可能。
builtinsメソッドformat()も存在する。
例:
>>> format(75.6564, '.2f')
 '75.66'

PEP3105:print関数

 Python3ではprint句は関数になった。なので、def print(...)でオーバーロードすることが可能。
 Python2.6ではimport __future__で従来のprintの代わりにprint()関数を使用可能。
例:
from __future__ import print_function
print('# of entries', len(dictionary), file=sys.stderr)
新しいメソッドの宣言はdef print(*args, sep=' ', end='\n', file=None)
パラメータ:
・args:位置パラメータ。値は出力される。
・sep:分割記号。各パラメータ間出力される。
・end:終了記号。
・file:結果はファイルへ出力される。
Python3へ移行することを考えると極力print()関数の使用をお勧めする。

PEP3110:異常処理の変化

 Pythonプログラマはよく下記のミスを犯す。
try:
 ...
except TypeError, ValueError: # Wrong!
 ...
作者はTypeErrorとValueError両方を獲得するつもりだったと考えられるが、実際は全然違う:
TypeErrorを獲得後ローカル変数ValueErrorへ渡される。
本来のValueErrorは獲得できない!
正確な書き方は異常のTupleを使用すること:
try:
 ...
except (TypeError, ValueError):
 ...
このミスの根源はカンマ「,」の意味合いにあった。これは文法分割かそれともTupleか?
 Python3ではカンマの代わりにasを使用することで、解消された。
異常を変数へ渡したい場合下記の書き方をしなければならない:
try:
 ...
except TypeError as var:
 ...
Pythen3はasのみサポートするが、2.6は両方使用可能。Python3に合わせることをお勧めする。

PEP3112:バイトリテラル

(公式ドキュメントを参照)

PEP3116:新しいI/Oライブラリ

(公式ドキュメントを参照)

PEP3118:修正されたバッファプロトコル

(公式ドキュメントを参照)

PEP3119:抽象基底クラス

(公式ドキュメントを参照)

PEP3127:整数リテラルのサポートと文法

(公式ドキュメントを参照)

PEP3129:クラス内装表記

(公式ドキュメントを参照)

PEP3141:数値型の階層

(公式ドキュメントを参照)

新しいモジュール変更と不評のモジュール変更

TODO

astモジュール

TODO

future_builtinsモジュール

TODO

jsonモジュール

TODO

plistlibモジュール

TODO

ctypesの強化

TODO

SSLサポートの改善

TODO

Python2.6への移植

2.6を使用するために、あなたのコードに下記の変更が必要かもしれない。
・クラスがhash化させたくなければ明示的に__hash__=Noneが必要である
・collections.dequeの__init__()メソッドはメンバーを追加する前に存在したdeque内容をクリアする。
・object.__init__()は任意のパラメータは受取らなくなり、TypeErrorを起こす可能性がある
・Decimalコンストラクタ現在前後スペースがある文字列を受取るようになった。
(前はInvalidOperation異常を投げていた)
逆にContextオブジェクトのcreate_decimal()メソッドはスペースを受取らなくなり、
ConversionSyntax異常を投げる
・実装時の問題でパスを__import__()に渡したら特定のファイルをimportしようとしたが、
今回はチェックがありImportErrorを起こす。
・C API:PyImport_ImportとPyImport_ImportModule関数は相対importでなくなり、絶対importとなる。
・C API:hash化しないデータタイプはPyObject_HashNotImplementedのtp_hash定義が必要。
・socketモジュール異常socket.error今回IOErrorから継承する。
前のバージョンまではStandardErrorでなかった。
・xmlrpclibモジュールのdatetime.data、datetime.timeからxmlrpclib.DataTimeへ自動変換しなくなる。
・(3.0警告モード)ExceptionクラスはSlicing、インデックスアクセスに警告を表示する。
TupleみたいなException行為は禁止される。
・(3.0警告モード)一致しない辞書、オブジェクトの比較は警告する。
dict1==dict2はよいが、dict1