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によって異なる。 ・Unix&MacOS:~/.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:数値型の階層
(公式ドキュメントを参照)新しいモジュール変更と不評のモジュール変更
TODOastモジュール
TODOfuture_builtinsモジュール
TODOjsonモジュール
TODOplistlibモジュール
TODOctypesの強化
TODOSSLサポートの改善
TODOPython2.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