Python 調査報告

サイボウズ株式会社 山本 泰宇

動的なオブジェクト指向言語である Python についての調査結果を報告する。報告内容は2006年10月現在の最新バージョンである Python-2.5 に基いている。

Pythonは適用可能分野が幅広く、かつ言語仕様がシンプルであるため、一度覚えると便利な道具である。例えばゲーム、ネットワークプログラミング、クロスプラットフォームGUI、Webアプリケーション開発、システム管理等に向く。

Pythonは非常に実用的な言語である。丁寧にドキュメント化された拡張方法、モジュール化された言語仕様、パッケージ形式の標準化等により、世界中の開発者がパッケージを公開していることが一助となっている。インターネット上にある多種多様なリソースにアクセスしやすいよう、本報告書はHTML形式となっている。

目次 [開]

Pythonのススメ

まずはじめに、Pythonを使うと何ができるかの概略を示します。本報告書はある程度コンピューター言語を知っている人を対象に書かれています。他の言語を知らない人は、まずPythonのチュートリアルに目を通すことをお勧めします。

Hello World!

Pythonを起動すると、インタープリタ(REPL, Read-Eval-Print Loop)として直接プログラムコードを入力できます。
> python
Python 2.5 (r25:51908, Sep 19 2006, 22:27:44)
[GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print "Hello World!"
Hello World!
色違いの文字はキーボード入力です。このように、有名な "Hellow World!" を出力するプログラムは非常にシンプルです。もちろん、ソースコードを実行することもできます。python プログラムは実際にはコンパイラでもあり、ソースコードを自動的にコンパイルして実行します。
> more hello.py
print "Hello World!"
> python hello.py
Hello World!

特徴

WikipediaのPythonの解説が良くまとまっています。
Pythonはオブジェクト指向言語です。Java, C++ とは異なり、全ての値はオブジェクトです。整数や文字列などは不変(immutable)なオブジェクトです。後述するように関数、型、さらにメタクラスさえもオブジェクトです。
> python
Python 2.5 (r25:51908, Sep 19 2006, 22:27:44)
[GCC 3.3.5 (Debian 1:3.3.5-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> type(3)
<type 'int'>
>>> type(3).__bases__
(<type 'object'>,)                    # int の親クラスは object

>>> class MyInt(int):                 # int を継承して MyInt クラスを作成可能
...     pass
...
>>> a = 3
>>> b = MyInt(3)
>>> a == b                            # MyInt のインスタンスは int と全く同様に振舞う
True
>>>  a * b
9
不変なオブジェクトの存在意義は、ハッシュ可能であることです。ハッシュ可能なオブジェクトはディクショナリ(連想配列)のキーとなれます。下の例ではタプルのハッシュ値を求めています。タプル自体は不変なオブジェクトですが、中に可変オブジェクトであるリストを含むと、ハッシュ可能ではなくなります。
>>> a = (3, 5)                        # int は不変なので、このタプルはハッシュ可能
>>> hash(a)
1698260191
>>> b = ([], "aaa")                   # 空リスト [] は可変なので、ハッシュ不可能
>>> hash(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
オブジェクト指向言語の種類としては、クラスベースとなります。が、クラスもオブジェクトであり、メタクラスによってその挙動をカスタマイズすることもできます。様々な点で静的なクラスベースの言語のようには制約されません。例えば、オブジェクトのクラスは簡単に変更可能です。
>>> class Foo(object):
...     def p(self):
...         print "foo"
...
>>> class Bar(object):
...     def q(self):
...         print "bar bar"
...
>>> a = Foo()
>>> a.p()
foo
>>> isinstance(a, Foo)
True
>>> isinstance(a, Bar)
False
>>> a.__class__ = Bar                 # a のクラスを Bar に変更
>>> isinstance(a, Bar)
True
>>> a.q()                             # クラス Bar のメソッド q を呼び出せる
bar bar
インスタンスの属性参照は、まずインスタンス自身を検索し、見つからなければそのクラスの属性、さらに見つからなければ親クラスの属性、と検索されます。クラスのメソッドも属性の一つにすぎないので、インスタンスが同名の属性を持てば呼び出されなくなります。
>>> class Foo(object):
...     p = 3
...
>>> f = Foo()
>>> f.p                               # インスタンス f に属性 p はないので、Foo.p を参照
3
>>> f.p = 10                          # インスタンスに属性 p を作成
>>> f.p
10
>>> Foo.p                             # クラス(オブジェクト)の属性はそのまま
3
ここに示したような挙動は、Pythonの動作原理を知ることで簡単に理解可能です。Pythonは様々な機能を提供しますが、全てはシンプルなルールのもとで動作しているのです。例えば、組み込み関数は "__builtins__" というモジュール(オブジェクト)を参照しているので、"__builtins__" を置き換えることで組み込み関数をすげかえることができます。組み込み関数が予約されているということはありません。
>>> a = __builtins__
>>> def my_type(*args):
...     print "hoge"
...
>>> type(a)
<type 'module'>
>>> __builtins__ = {'type':my_type}   # ディクショナリ(連想配列)を __builtins__ に設定
>>> type(a)
hoge
Pythonの文法は、インデントと改行を強制します。Pythonはもともと教育用に作られたので、ドキュメントを重視し、コードも分かりやすくする文化があるようです。JavaやCに慣れた方は、最初はとまどうかもしれませんが、すぐに慣れます。コーディングスタイルを揃えることのメリットを理解していればね!
Pythonの言語仕様はシンプルです。これは Perl との大きな違いです。PerlのTIMTOWTDI哲学(There Is More Than One Way To Do It)は、あることに対して何種類もの記法・やり方を提供しています。この違いは、チームでの開発やメンテナンス性において Python を Perl よりも優位とするでしょう。PerlとPythonの比較で一例を挙げると、Perlの予約語が200を越すのに対し、Pythonの予約語はわずか30語です。まとめると、

何ができるか

Application Domain がカバーしている範囲を良く表しています。
Pythonはそれ自体でも多彩な機能を提供しますが、glue(糊)として利用されるケースも多いです。例えば標準ライブラリには以下のような機能が含まれます。
拡張モジュールとしては以下のようなものがあります。
Pythonが使われているものとしては以下のようなものがあります。

他言語との比較

Programming Language Comparison が良くサーベイしています。パフォーマンスについては The Computer Language Shootout Benchmarks で比較すると良いでしょう。
性能面ではJavaやC++等には大分劣りますが、Perl・PHP・Rubyと言った主要なスクリプト言語と比較すると速いことが分かります。また、こちらでは、PsycoのJIT(Just-In-Time Compile)機能による高速化の様子が見れます。(Psycoについてはこちらこちらの記事が詳しいです)

Pythonを学ぶには

残念ながら、Pythonの日本における普及度はそれほど高くありません。この一つの理由は、日本語コーデックの標準搭載が比較的最近(Python-2.4)であったためだと思われます。そのような中でも、日本Pythonユーザー会および日本語訳は役に立つでしょう。
実際のコーディングの際には pydoc が詳細なAPIを示してくれます。pydoc はPythonのソースコード中のドキュメント文字列(docstring)をHTML形式やテスト形式に整形して表示します。また Python Quick Reference はPythonの様々な情報を簡潔に整理したリファレンスを提供しています。
本としては、「Pythonクイックリファレンス」はお勧めできます。Python-2.3 までの情報しか載っていませんが、新しいスタイルのクラスのことなどはこの本で理解できます。最近の書籍としては、「みんなのPython」も良いでしょう。
ですが、Pythonを使いこなすにはどうしても英語の情報にあたらなければならないでしょう。最新の言語仕様や PEP (Python Enhancement Proposals) は全て英語です。また、各種の便利なモジュール類も大抵は英語のドキュメントしかありません。
Pythonはバージョンを追うごとに益々洗練され、便利になっています。最新の機能を知るには各バージョンの "What's New" ドキュメント(2.3, 2.4, 2.5)にあたりましょう。本報告ではPython-2.3以降で知っておきたいポイントをいくつか解説しています。

開発体制

後述するように、Pythonの処理系はいくつかあり、処理系ごとに開発体制は異なっています。ですが、仕様策定の中心となる(リファレンス的な)実装としてCPythonがあり、一般に Pythonと言うとCPythonのことを指しています。
CPythonは元々は Guido van Rossum 氏(現Google)によって作られました。今でもGuido氏は開発の中心であり、BDFL(Benevolent Dictator For Life)とも呼ばれ、CPythonの言語仕様の決定権を持っています。
CPythonの仕様は慎重に検討されています。JavaにおけるJSRのように、Pythonにおける仕様の変更も全てドキュメント化され、検討プロセスに載せられます。それらは PEP (Python Enhancement Proposals) と呼ばれ、例えばリリース計画などもPEP化されています。
バージョン間の互換性も重視されています。バックワードコンパチビリティのみならず、フォワードコンパチビリティにも配慮されているのです。具体的には __future__ によるコンパチビリティ制御機能を参照してください。
CPythonのバージョン番号は三つ組で表現され、三番目は(主に)バグフィックスのためのリビジョン番号となっています。

言語

Pythonの言語自体については、各種の本やドキュメントを参照してください。ここでは、特に興味を引きそうなトピックに焦点を絞って解説します。

モジュール

Pythonソースファイルから、他のPythonソースファイルを import すると、モジュールオブジェクトが取得できます。ソースコードのトップレベルで定義した識別子は、モジュールオブジェクトの属性となります。C言語のように大域変数にはなりません。
> more > test.py
a = 3                                 # トップレベルで a を定義
> python
Python 2.5 (r25:51908, Sep 20 2006, 12:09:43)
[GCC 3.4.3 20050227 (Asianux 2.0 3.4.3-22.1.1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import test                       # test モジュールオブジェクトを名前 "test" に束縛する
>>> print test
<module 'test' from 'test.py'>
>>> test.a                            # a は test モジュールの属性
3

柔軟な呼び出し方式

Pythonは関数の呼び出し方式として、位置指定の引数(positional arguments)以外に名前指定の引数(keyword arguments)もサポートします。
>>> def hoge( a, b = 2, c = 3 ):      # b, c, はデフォルト値 2, 3 を持つ
...     print a, b, c
...
>>> hoge( 1 )
1 2 3
>>> hoge( 1, 5 )
1 5 3
>>> hoge( 1, c = 10 )                 # b を飛ばして、3番目の引数 c を指定可能
1 2 10
位置指定の引数は *args としてリスト形式で渡すことも可能です。同様に名前指定の引数は **args としてディクショナリ形式で渡すことも可能です。
>>> args = [ 100, 1000 ]              # リスト形式のパラメータを作成
>>> hoge( *args )
100 1000 3

>>> args = { 'a':100, 'c':1000 }      # ディクショナリ形式のパラメータを作成
>>> hoge( **args )
100 2 1000
同様の形式で仮引数を宣言すると、リスト形式または辞書形式でオプショナルな引数を受け取ることができます。
>>> def fuga( a, b = 2, *arg_list, **arg_dict ):
...     print arg_list, arg_dict
...
>>> fuga( 3 )
() {}
>>> fuga( 3, 2, 1 )
(1,) {}
>>> fuga( 3, 2, 1, c = 5 )
(1,) {'c': 5}

演算子は特殊メソッド

Pythonの演算子(<, >, ==, %, +, abs() など)の多くは、特殊メソッドによってオーバーライド可能です。標準の型でも、シーケンスの '+' や文字列型の '%' などが特殊メソッドによって実装されています。
>>> "line %d reads %s" % (3, 'hoge')  # 文字列の % 演算子は __mod__()で実装されている
'line 3 reads hoge'
>>> "line %d reads %s".__mod__( (3, 'hoge') )
'line 3 reads hoge'
(関数の)呼び出し演算も特殊メソッドによって実装できます。下に示す __call__ メソッドを提供するオブジェクトのことをPythonでは「呼び出し可能(callable)」オブジェクトといいます。
>>> class Hoge(object):
...     def __call__(self, *args):
...         return reduce(__import__('operator').mul, args)
...
>>> h = Hoge()
>>> h(3, 5, 6)                        # インスタンス h を「呼び出し」
90
>>> callable(hoge)                    # 呼び出し可能かどうかのチェック
True

関数はオブジェクトで一級

前節で解説した通り、関数は呼び出し可能なオブジェクトの一種です。このオブジェクトは可変で、任意の属性を持たせることができます。
>>> def fuga():
...     print 'fuga'
...
>>> callable(fuga)
True
>>> fuga.a = 3                        # 属性 a を付与
>>> fuga.a
3
メソッドも関数と同じようにオブジェクトです。このように全てがオブジェクトであることから、関数やメソッドを一級(first class)に扱えます。ハンドラとしてメソッドや関数をその場で渡せるため、PythonにおけるGUIプログラミングは関数型言語のように簡潔に記述できます。下に示すサンプルは wxPython のコード例です。
>>> import wx
>>> class MyFrame(wx.Frame):
...     def __init__(self, parent):
...         super(MyFrame, self).__init__(parent, -1)
...         self.Bind(wx.EVT_CLOSE, self.OnCloseMe)    # 引数として束縛されたメソッドを渡せる
...         self.Show()
...     def OnCloseMe(self, event):
...         print 'hoge'
...         self.Destroy()
...
>>> app = wx.PySimpleApp()
>>> frame = MyFrame(None)
>>> app.MainLoop()
hoge                                                   # ウィンドウを閉じると表示される

Duck Typing

前項で紹介したように、Pythonではオブジェクトの振舞いのほとんどはメソッドの実装によって定義できます。例えば数値のように振舞うオブジェクトを作りたければ、数値クラスが持つべきメソッドを持つクラスを定義すれば良いのです。数値以外にもシーケンス、ディクショナリ、イテレータといった型を、メソッドを定義することでエミュレートできます。こういったプログラミングスタイルのことをDuck Typingと言います。
例えば標準モジュールの StringIO は、ファイルオブジェクトと互換の StringIO クラスを提供します。ですが、ファイルオブジェクトと StringIO クラスは(objectを除いて)共通する型を持つわけではありません。
Duck Typing はコードに柔軟性を与える点では優れています。反面、定義するべきメソッドを明確にしないため、暗黙の約束事を常に意識する必要があります。この欠点を克服する試みとしては Zope Interfaces があります。Zope Interfaces はオブジェクトが備えるべき挙動を記述し、チェックできる機構を提供します。Javaのインターフェースと違って、このインターフェースは予め実装するだけではなく、後から宣言することも可能です。

新しいスタイルのクラス

Pythonのオブジェクトには二通りの振舞いが存在します。一つはクラシックなクラスと呼ばれ、Python-2.2以前はこちらしか利用できませんでした。Python-2.2からは、新しいスタイルのクラスが利用できます。新しいスタイルのクラスの特徴はドキュメントを参照してください。
>>> class A:                          # 何も継承しないと、クラシックスタイルとなる
...     pass
...
>>> a = A()
>>> class B(object):                  # 組み込み型を継承すると新しいスタイルとなる
...     pass
...
>>> b = B()

>>> type(A)                           # クラシックスタイルのクラスの型は 'classobj'
<type 'classobj'>
>>> type(B)                           # 新しいスタイルのクラスの型は 'type'
<type 'type'>
>>> type(a)                           # クラシックスタイルのインスタンスの型は常に 'instance'
<type 'instance'>
>>> type(b)                           # 新しいスタイルのインスタンスの型はクラスオブジェクト
<class '__main__.B'>
チュートリアルにおけるクラスの説明は現在新しいスタイルのクラスに言及していませんが、これから作成するプログラムは必ず新しいスタイルで作成するべきです。全ての組み込みデータ型は、新しいスタイルのクラスです。ですので組み込み型のサブクラスを作成して拡張することができます。
>>> class MyList(list):              # listクラスの独自サブクラス
...     pass
...
>>> type(MyList)                      # MyList は新しいスタイルのクラス
<type 'type'>
新しいスタイルのクラスで利用できるようになった、スタティックメソッドプロパティといった機能は Descriptors によって実現されています。Descriptorsは属性参照を制御できるオブジェクト単位の機構です。従来のクラスではクラスの特殊メソッド(__getattr__, __setattr__, __delattr__)を実装することで属性参照を制御していましたが、Descriptorsは属性オブジェクトごとに挙動を制御できるのでより柔軟です。
>>> class C(object):
...     def getHoge(self):
...         return 10
...     hoge = property(getHoge, doc = 'hoge')
...
>>> c = C()
>>> c.hoge                            # プロパティ属性の参照は getHoge() を呼び出す
10
>>> C.hoge
<property object at 0xb7d2f414>
>>> dir(C.hoge)                       # プロパティは __get__, __set__, __delete__ を持つDescriptor
['__class__', '__delattr__', '__delete__', '__doc__', '__get__',
 '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__',
 '__reduce_ex__', '__repr__', '__set__', '__setattr__', '__str__',
 'fdel', 'fget', 'fset']
>>> C.hoge.__get__(c)                 # 属性参照はDescriptorの __get__ 呼び出しと等価
10

メタクラス

メタクラスとは、クラスの型のことです。オブジェクトの挙動をクラスが規定するように、クラスの挙動はメタクラスで規定されます。前項で示したように、新しいスタイルのクラスの場合は 'type' になります。
例えば、クラス属性を自動的にインスタンス属性の初期値とするようなメタクラスは以下のようになります。この例では元々の __init__() メソッドを拡張する内部関数 init() を定義し、__init__() を置き換えています。
>>> class MyMeta(type):                               # メタクラスは通常 'type' を拡張して作成
...     def __init__(cls, name, bases, dict):         # インスタンスとなるクラスオブジェクトを初期化
...         original = dict.get('__init__', None)     # クラスで定義される __init__() を保持
...         def init(self, *args, **kwargs):
...             for (kw, value) in dict.iteritems():
...                 if callable(value):
...                     continue
...                 setattr(self, kw, value)          # クラス属性の値をインスタンスの属性とする
...             if original is not None:
...                 original(self, *args, **kwargs)
...         setattr(cls, '__init__', init)            # クラスの __init__() を置換
...
>>> class Hoge:
...     __metaclass__ = MyMeta                        # メタクラスは __metaclass__ 属性で指定
...     x = 3
...     y = 10
...     def __init__(self, msg):
...         print msg
...
>>> h = Hoge('fuga')
fuga                                                  # オリジナルの __init__() は維持されている
>>> vars(h)
{'y': 10, 'x': 3, '__module__': '__main__'}           # インスタンスには x, y 属性がセット済み

最新機能

CPythonの最近のバージョンで追加された機能から、個人的なお勧めをいくつか紹介します。

Python-2.3 (What's New)

Python-2.4 (What's New)

Python-2.5 (What's New)

処理系

処理系の一覧に、現在ある処理系がリストされています。最も良く使われている処理系は CPython です。CPythonのメモリ管理は基本的にはリファレンスカウントですが、サイクルを見付けるためにトラバース処理もなされます。
独立した処理系ではないのですが、PsycoはCPythonの拡張モジュールとしてJIT機能を提供します。現在のところは x86 CPU 限定です。他言語との比較でもPsyco関連の情報を解説しています。
Stackless Pythonはネイティブなスレッドの代わりにマイクロスレッドを使用するCPythonから派生した処理系です。並列計算を便利にしてはくれますが、CPythonと非互換な点もあります。Cスタックを使わないためCPythonより約10%高速である点などを活かして、MMO RPGなどで使用されています。
JythonはJavaに埋め込める実装です。Javaと良く結合されており、Javaのオブジェクトを利用できます。CPythonの 2.1 相当の機能を実装しており、CPythonが 2.5 であることを考えると開発は遅いと言えるでしょう。メモリ管理は JVM に任せています。
IronPythonは .NET フレームワーク2.0上で動作する実装です。.NETフレームワークの機能を簡単に利用することができます。CPython-2.4の機能に加え、2.5の機能も相当数含んでいます。それに加え、Cの実装よりも 1.7 倍速いとのこと。デモも魅力的です。

機能

主要なトピックをカテゴリー別に解説します。特に触れない限り、CPythonを前提としています。

開発補助

コンパイル、ドキュメンテーション、テスト、デバッグ、プロファイリングといった開発補助機能は標準で提供されています。

コンパイル

Pythonはソースコードを中間コードにコンパイルしてから実行します。コンパイル結果は .pyc (もしくは .pyo) という拡張子のファイルに保存されます。現在のところ、最適化(python -O)は assert 文を除去する効果しかないようです。
手動でPythonソースコードをコンパイルしたい場合は、py_compile または compileall モジュールを使用します。どちらもコマンドラインから利用できます。
python [-O] -m py_comile   *.py
python [-O] -m compileall  DIR

ドキュメンテーション

Pythonのモジュールや関数、クラスなどは docstring というドキュメント属性を持つことが可能です。docstring の最初の行は大文字から始めて簡潔に動作を記述します。さらに詳細を記述する場合は2行目は空行とし、3行目から内容を記述するようにします。
def numerize( x ):
    '''Return the argument if it is integer; otherwise returns 1.

    Arguments:
    x:            any object to be numerized.
    '''
    return x if type(x) is int else 1
Pythonのソースコードドキュメンテーションは pydoc モジュールによって処理されます。UNIX環境では pydoc と同名のコマンドもインストールされます。pydoc はHTMLかテキスト形式のドキュメントを生成します。また簡易なGUIも備えており、"pydoc -g" で利用できます。
> pydoc hoge.numerize                      # 上の numerize 関数を hoge.py に保存
Help on function numerize in hoge:

hoge.numerize = numerize(x)
    Return the argument if it is integer; otherwise returns 1.

    Arguments:
    x:            any object to be numerized.

テスト

doctestはコメント(docstring)に書いた用例が正しいことを検証します。xUnit系の単体テストであれば、unittestフレームワークを使います。

デバッグ

pdbモジュールがデバッガの機能を提供します。pdbはコマンドラインインターフェースも提供します。
python -m pdb *.py

プロファイリング

Python Profilersにプロファイリングに関する情報がまとまっています。Python-2.5からは負荷を軽くするためにCで作成された cProfile モジュールも提供されています。cProfile(profile)はコマンドラインインターフェースも提供します。
python -m cProfile hoge.py
         10004 function calls in 0.018 CPU seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.018    0.018 <string>:1(<module>)
        1    0.010    0.010    0.018    0.018 hoge.py:3(<module>)
    10000    0.008    0.000    0.008    0.000 hoge.py:3(numerize)
        1    0.000    0.000    0.018    0.018 {execfile}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

データベース

DB-API 2.0という標準があり、ほとんどのデータベースドライバはこの標準に準拠しています。ODBC, JDBC のようなものです。
MySQLであれば、MySQL for Pythonを使うのが良いでしょう。MySQL-5.0まで対応しています。Prepared Statement は現時点ではエミュレーションでの対応です。
Object Relational マッピングにはSQLAlchemyが良く使われています。SQLAlchemyはORマッピングで良く問題になる点(JOINやサブクエリへのマッピング、クエリチューニングなど)に対応できるように設計されています。

国際化

Pythonでは8bit文字列とユニコード文字列は型として分かれています。国際化するにあたってはユニコード文字列を使用することになるでしょう。様々なエンコーディング方式には codecs を通してアクセスしてください。特に有用なのは、'codecs.open()' です。open() と同様に使えますが、文字コードを透過的に変換します。
>>> f = codecs.open('abc', 'w', 'shift_jis')    # シフトJISコードでファイルに書き出し
>>> f.write(u'あいうえお')
>>> f.close()
タイムゾーンについては標準モジュール datetime の datetime.tzinfo にて提供されますが、具体的なタイムゾーンデータは付属していません。pytz - World Timezone Definitions for Python にて提供されているデータを利用するのが良いでしょう。
文字列カタログとしてはUNIXのgettext互換の gettext モジュールが存在します。

ネットワーク

Pythonは低レベルのネットワーク操作を提供する socket モジュールから、高レベルのプロトコルを提供する smtplib, poplib, imaplib, urllib2 などを備えています。
非同期通信のためには asyncore モジュールが存在しますが、優れたツールキットであるTwistedを利用するほうが良いでしょう。Twistedの特徴についてはこちらの記事が参考になります。Twistedのサブプロジェクトには DNS, SSH, 各種のIMプロトコルなどがあります。

GUI開発

TkInter が標準的なGUIライブラリとして提供されていますが、できあがるアプリケーションのUIは「そこそこ」にとどまります。
その他、様々なGUIライブラリモジュールが存在しますが、一番のお勧めは wxPython です。クロスプラットフォームで、OSネイティヴのコントロールを使うため、洗練されたUIを作れます。ドキュメントがオンラインでは整備されていないのが困ったところですが、幸いほぼ最新の wxPython を解説したが発売されています。

Webアプリケーション開発

Webサーバーとの接続には mod_python, CGI, FastCGI 等々の規格が存在しますが、それらを統合する WSGI (Web Server Gateway Interface) というインターフェースが存在します。
Webアプリケーションフレームワークには DjangoTurboGears といったものが存在しますが、これらもWSGIに対応済みです。
その他の方法としてはASPの言語としてPythonを適用することもできます。

XML処理

Pythonには標準でも基本的なXMLやHTML処理用のライブラリが付属しています。さらに高機能なパーザー群が必要であれば、PyXML4Suiteを導入しましょう。後者ではXSLTやRelaxNGの処理も可能です。
SOAP/WSDLにはZolera Soap Infrastructureが良いでしょう。また、RSS/ATOMの処理にはUniversal Feed Parser安全性などの点からお勧めです。

Pythonの拡張

CPythonをC言語で拡張するにはいくつか方法があります。もっとも基本的な方法は C APIを利用して拡張モジュールを作成するか、C言語にインタープリタを埋め込むものです。単純にシステムのライブラリを呼び出すだけであれば、Python-2.5から標準になった ctypes モジュールを利用できます。
C言語で拡張モジュールを作成する方法としてはもっと簡便な方法もあります。Swigは既存のライブラリに対するPythonラッパーを作成する場合に便利でしょう。PyrexはPythonに似た文法で拡張モジュールを作成できるツールです。Swig, Pyrex のいずれも、C言語のソースコードを生成します。
C++に埋め込むのであれば Boost.Python を利用しましょう。リファレンスや引数の処理を簡便にしてくれます。JavaにはJython、.NETにはIronPythonがもちろん適しています。こちらの記事では IronPython と C# の連携を解説しています。

配布

標準化されている distutils によって、簡単にソースパッケージを作ることができます。PEAKの setuptools は distutils の拡張で、egg という1ファイル形式(JavaのJARファイルのようなもの)での配布や、前述のPyrexなどをサポートします。setuptools は distutils の上位互換であるため、setuptools を使用しない理由はありません。積極的に使用しましょう。
ゲームなど、実行可能形式として配布したいときには py2execx_Freeze を利用できます。どちらも簡単に使えるでしょう。py2exeを使えばWindowsサービスやCOMサーバーを作ることもできます。
一般的な注意として、配布の際にはバンドルされるモジュールのライセンスに注意しましょう。特に、py2exeは(と言うよりも http://www.python.org/ で配布されるWindows版Pythonは) MSVCR71.dll をバンドルします。これは Visual Studio .NET 2003 の再配布モジュールですので、配布に際しては Visual Studio .NET 2003 を購入している必要があります。

開発環境

Emacsをお使いの人には、python-mode が便利です。Emacsとコンソールがあれば十分という方にはIPythonがお勧めです。IPythonの特徴はこちらの記事に良くまとまっています。
CPythonに標準でついている IDLE は、簡素ながらコードエディタにデバッガを統合した開発環境を提供します。お勧めは Eclipse Plugin の PyDev です。コード補完、デバッグ等が CPython, Jython 両方で可能です。
IronPython は Visual Studio に統合することができます。こちらの記事を参考にしてください。その他にも色々なIDEがあります。こちらの評価記事が参考になるでしょう。

参考文献

  1. Pythonクイックリファレンス
  2. みんなのPython
  3. wxPython in Action
  4. Twisted Network Programming Essentials

リファレンス

  1. http://4suite.org/index.xhtml
  2. http://blogs.msdn.com/aaronmar/archive/2006/02/16/533273.aspx
  3. http://boost.cppll.jp/HEAD/libs/python/doc/
  4. http://d.hatena.ne.jp/Wacky/20060910/1157881776
  5. http://docs.python.org/ext/ext.html
  6. http://docs.python.org/lib/lib.html
  7. http://docs.python.org/lib/markup.html
  8. http://docs.python.org/lib/module-StringIO.html
  9. http://docs.python.org/lib/module-Tkinter.html
  10. http://docs.python.org/lib/module-asyncore.html
  11. http://docs.python.org/lib/module-cgi.html
  12. http://docs.python.org/lib/module-codecs.html
  13. http://docs.python.org/lib/module-compileall.html
  14. http://docs.python.org/lib/module-csv.html
  15. http://docs.python.org/lib/module-ctypes.html
  16. http://docs.python.org/lib/module-datetime.html
  17. http://docs.python.org/lib/module-distutils.html
  18. http://docs.python.org/lib/module-doctest.html
  19. http://docs.python.org/lib/module-gc.html
  20. http://docs.python.org/lib/module-gettext.html
  21. http://docs.python.org/lib/module-hashlib.html
  22. http://docs.python.org/lib/module-imaplib.html
  23. http://docs.python.org/lib/module-msilib.html
  24. http://docs.python.org/lib/module-pdb.html
  25. http://docs.python.org/lib/module-poplib.html
  26. http://docs.python.org/lib/module-profile.html
  27. http://docs.python.org/lib/module-pycompile.html
  28. http://docs.python.org/lib/module-pydoc.html
  29. http://docs.python.org/lib/module-smtplib.html
  30. http://docs.python.org/lib/module-socket.html
  31. http://docs.python.org/lib/module-unittest.html
  32. http://docs.python.org/lib/module-urllib2.html
  33. http://docs.python.org/lib/module-webbrowser.html
  34. http://docs.python.org/lib/profile.html
  35. http://docs.python.org/ref/callable-types.html
  36. http://docs.python.org/ref/node33.html
  37. http://docs.python.org/tut/node18.html#l2h-46
  38. http://docs.python.org/tut/node6.html#SECTION006720000000000000000
  39. http://docs.python.org/tut/node6.html#SECTION006760000000000000000
  40. http://docs.python.org/tut/node7.html#SECTION007140000000000000000
  41. http://docs.python.org/tut/node7.html#SECTION007500000000000000000
  42. http://docs.python.org/tut/node8.html
  43. http://docs.python.org/tut/node8.html#SECTION008120000000000000000
  44. http://docs.python.org/tut/tut.html
  45. http://feedparser.org/docs/
  46. http://feedparser.org/docs/html-sanitization.html
  47. http://ipython.scipy.org/
  48. http://ja.wikipedia.org/wiki/Python
  49. http://maxq.tigris.org/
  50. http://mojix.org/2006/01/05/154011
  51. http://peak.telecommunity.com/DevCenter
  52. http://peak.telecommunity.com/DevCenter/PythonEggs
  53. http://peak.telecommunity.com/DevCenter/setuptools
  54. http://people.redhat.com/berrange/virt-manager/
  55. http://psyco.sourceforge.net/
  56. http://pydev.sourceforge.net/
  57. http://python.matrix.jp/modules/ipython.html
  58. http://pytz.sourceforge.net/
  59. http://pywebsvcs.sourceforge.net/zsi.html
  60. http://pyxml.sourceforge.net/
  61. http://rgruet.free.fr/
  62. http://shootout.alioth.debian.org/
  63. http://sky.zero.ad.jp/~zaa54437/programming/concepts/index3.htm#f0
  64. http://sourceforge.net/projects/mysql-python
  65. http://sourceforge.net/projects/python-mode/
  66. http://spyced.blogspot.com/2006/02/pycon-python-ide-review.html
  67. http://starship.python.net/crew/atuining/cx_Freeze/index.html
  68. http://subversion.tigris.org/
  69. http://support.microsoft.com/default.aspx?scid=kb;ja;276494
  70. http://twistedmatrix.com/trac/
  71. http://twistedmatrix.com/trac/wiki/TwistedConch
  72. http://twistedmatrix.com/trac/wiki/TwistedNames
  73. http://twistedmatrix.com/trac/wiki/TwistedProjects
  74. http://twistedmatrix.com/trac/wiki/TwistedWords
  75. http://users.rcn.com/python/download/Descriptor.htm
  76. http://www.atransia.co.jp/home/fukamachi/Diary/2006/06/10/
  77. http://www.bittorrent.com/
  78. http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython
  79. http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython&title=v1.0%20Release%20Notes
  80. http://www.codeplex.com/WorkItem/WorkItemFileAttachmentDownload.aspx?ProjectName=IronPython&WorkItemId=2731&FileAttachmentId=869
  81. http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/
  82. http://www.cyberfront.co.jp/title/civ4/
  83. http://www.djangoproject.com/
  84. http://www.ibm.com/jp/developerworks/linux/021220/j_l-psyco.html
  85. http://www.jvoegele.com/software/langcomp.html
  86. http://www.jython.org/Project/index.html
  87. http://www.microsoft.com/japan/msdn/vstudio/previous/2003/
  88. http://www.modpython.org/
  89. http://www.osnews.com/story.php/5602/Nine-Language-Performance-Round-up-Benchmarking-Math-and-File-IO/page3/
  90. http://www.py2exe.org/
  91. http://www.pygame.org/news.html
  92. http://www.python.jp/Zope/
  93. http://www.python.jp/Zope/links/python_documents
  94. http://www.python.jp/doc/nightly/tut/tut.html
  95. http://www.python.org/
  96. http://www.python.org/2.5
  97. http://www.python.org/about/apps/
  98. http://www.python.org/about/quotes/
  99. http://www.python.org/dev/implementations/
  100. http://www.python.org/dev/peps/
  101. http://www.python.org/dev/peps/pep-0236/
  102. http://www.python.org/dev/peps/pep-0249/
  103. http://www.python.org/doc/2.3.5/whatsnew/node9.html
  104. http://www.python.org/doc/2.3.5/whatsnew/section-enumerate.html
  105. http://www.python.org/doc/2.3.5/whatsnew/whatsnew23.html
  106. http://www.python.org/doc/2.4.3/whatsnew/node2.html
  107. http://www.python.org/doc/2.4.3/whatsnew/node4.html
  108. http://www.python.org/doc/2.4.3/whatsnew/node6.html
  109. http://www.python.org/doc/2.4.3/whatsnew/whatsnew24.html
  110. http://www.python.org/doc/2.5/lib/module-contextlib.html
  111. http://www.python.org/doc/2.5/whatsnew/pep-308.html
  112. http://www.python.org/doc/2.5/whatsnew/pep-343.html
  113. http://www.python.org/doc/2.5/whatsnew/pep-343.html#SECTION000910000000000000000
  114. http://www.python.org/doc/2.5/whatsnew/whatsnew25.html
  115. http://www.python.org/doc/newstyle/
  116. http://www.python.org/download/releases/2.2.3/descrintro/#metaclasses
  117. http://www.python.org/download/releases/2.2.3/descrintro/#property
  118. http://www.python.org/download/releases/2.2.3/descrintro/#staticmethods
  119. http://www.python.org/pypi
  120. http://www.saddi.com/software/flup/
  121. http://www.scipy.org/
  122. http://www.sqlalchemy.org/
  123. http://www.stackless.com/
  124. http://www.stackless.com/wiki/Applications
  125. http://www.swig.org/
  126. http://www.swig.org/Doc1.3/Python.html#Python
  127. http://www.turbogears.org/
  128. http://www.wsgi.org/wsgi
  129. http://www.wxpython.org/
  130. http://www.zope.org/
  131. http://yamashita.dyndns.org/blog/twisted-the-event-driven-framework
  132. http://zope.org/Wikis/Interfaces/FrontPage

改訂履歴

改訂:2006年10月17日

本改訂に際してはPython-ml-jpより Kazuo Moriwaka 氏、メールにて西尾泰和氏よりいただいたご意見を参考にしました。心より感謝いたします。

初版:2006年10月10日


Valid HTML 4.01 Transitional