Python & IronPython 入門

2006.10/23 - 2008.6/13 (鈴)

入手先

  1. 普通の Python (Windows インストーラ, Mac インストーラ, ソース):
    http://www.python.org/download

    現行版は Python 2.5.2。 現行版も決して完全無謬ではないが, Python 2.4.* 以前に長らくあった日本語関連を含む多数のバグが解決され, 機能・性能・安定性とも向上している。 新しくインストールする場合,特に理由がなければ,これを選択するとよい。

    上記の一次配布場所には Mac 用を除き Unix 類のためのバイナリが用意されていないから, ソースからビルドする必要がある。ただし, 普通は 各 Unix 類でそれぞれバイナリ・パッケージが用意されているから, さしあたりは (必ずしも最新バージョンではないが) それを使えばよい。 とりわけ, Red Hat Linux のようにシステムの中核部分に Python が利用されている場合, 新しいバージョンを独自にインストールするとき, 既存のバージョンに干渉しないよう注意する必要がある。

    現在,大きな改訂版である Python 3.0 が Python 3000 計画に沿って開発されている。 Python 2.* 系列からの穏やかな移行を実現するため Python 2.6 も開発されている。

    Windows ユーザへの注意: 執筆時現在, http://www.python.jp/Zope/download 等で Windows 向けに 日本語環境用インストーラ(Win32) として Python 2.3.4 をベースに独自改造したものが配布されている。 しかし,レガシー・システムを抱えた熟練技術者以外,その使用は推奨できない。 オリジナルの Python が日本語を処理できるようになって以来,更新は停滞している。 Python 2.3.* の現在のバージョンは,既知のバグと脆弱性に対処した Python 2.3.7 である。 仮にレガシー・システムの維持のために「日本語環境用」Python 2.3.* がやむを得ず必要だとしても,Python 2.3.4 以降の改修点が当該システムのセキュリティや可用性等に対し重要でないことを確認するか, または「日本語環境用」Python のソースパッチを入手し,現在のソースに適用・構築することが必要である。 とりわけ Python 2.3.5 で導入された改修点が多数かつ重要なため,少なくとも 2.3.5 相当に更新することが望ましい。

  2. Cygwin 版 Python:
    http://www.cygwin.com からの setup.exe 経由

    Windows 上で動作する Unix 互換環境 Cygwin は,他の Unix 類と同じく, 1. のソースからビルドした Python のバイナリ・パッケージを標準で用意している。 現在のバージョンは 2.5.1。

  3. IronPython:
    http://www.codeplex.com/IronPython

    C# で新しく記述された Python 実装。 現在のバージョンは 1.1.1。 仕様は Python 2.4.* に準じているが, Python 2.5.* の仕様も標準ライブラリを流用できる程度に実現している。 .NET Framework 2.0 を必要とする。

    (IronPython には,対 Python 2.5 互換性向上の隠しオプションとして -X:Python25 が用意されている。ソースの IronPyton-1.1.1/Src/IronPythonConsole/PythonCommandLine.cs 第 242 行参照。 とりわけ try-finally の try ブロックでの yield が構文的に許されるようになる。 ただし,正常には動作しない。 今のところ,あくまで隠しオプションである)

    IronPython は,今までの Python の「実装」ではなく, 明文化された「仕様」に基づいている (主要標準ライブラリの下請けモジュールなど, 明文化された仕様なしに実装せざるを得ない箇所はその限りではないが)。 実装に自由度がある場合,与えられた条件の下でなるべく技術的に妥当と考えられる 実装仕様を採る方向で作られている。 たとえば,使用済みのオブジェクトが回収されるタイミングは, 参照カウンタによる従来の実装では即時的だが,言語仕様書による要件ではない ("Objects are never explicitly destroyed; however, when they become unreachable they may be garbage-collected. An implementation is allowed to postpone garbage collection or omit it altogether...") から, IronPython では .NET のメモリ管理をそのまま利用している。

    したがって,Python スクリプトの品質保証テストにもある程度は用いることができる。 模範的な Python スクリプトならば IronPython でも動作するというわけでは必ずしもないが,もしも普通の Python と IronPython の両方で問題なく実行できるならば, たまたまの実装詳細に依存しない行儀の良い Python スクリプトであるという客観的な証拠となる。

  4. その他の主な実装:
    1. 軽量なマイクロスレッドを実装し,多数のイベントを扱う実時間応用に適した Python の有力な方言として Stackless Python http://www.stackless.com がある。 開発当初,Python の本流に合流しようとしたが (PEP 219PEP 220), 当時有望視されていた Java 環境への移植性の欠如を主な理由として拒絶された苦い歴史を持つ。 しかし,それ以降も現実の需要に応え,普通の Python に対する改造版として継続的にリリースされている。 現在のバージョンは現行版に対応する 2.5.2

    2. Python の Java 環境への移植として Jython http://www.jython.org がある。 当初は第2の Python 実装として有望視され,Java VM 上のインタープリタとしてもトップクラスの性能を誇った。 去年およそ5年半ぶりに新バージョン Jython 2.2 がリリースされたが, 満を持しての,というよりはむしろ長年放置していた作業に区切りをつけた,という性格のリリースである。 Jython 2.2 は,長い停滞期に入った当時,現行版だった Python 2.2 に相当する仕様を持つ一種の生きた化石である。 現在のバージョンは,Jython 2.2 のリリース直後に発見された (漢字など非 ASCII 文字をコンソール入力できない等の) バグを改修した 2.2.1。 ただし,Java VM 上のインタープリタとしては今なお強力で高速な部類である。

    3. PyPy http://codespeak.net/pypy/ は言語処理系の理論と実際の両面から注目すべき Python 実装である。 2003 年ごろ開始され,2004 年には EU (ヨーロッパ連合) から資金を受けた。 名称は Python in Python (Python で書かれた Python) に由来する。 Python のサブセット (RPython) で書かれた Python インタープリタと, C, .NET CLI, Java VM などへ変換するトランスレータから構成される。 Python の言語仕様を拡張/変更する実験プラットフォームとして, あるいは高速なコードを生成する Python コンパイラとして利用できる。 1.0 版は Python 2.4.* のサブセットに相当するが,subversion を使ってより新しい配布版を取得することが強く推奨されている。 2008年1月21日には,コンパイルしたコードが C 言語で書かれたプログラムより高速になったケースが 報告されている。

導入と設定

典型的な Unix のコマンドシェルと同様, Python はデフォルトの状態で使い勝手が良いようにはなっていない。 ここでは利用時に手間がかからないようにする方向での無難な導入と設定の方法を, 主に Windows を例にして示す。 これ以外の設定方法については,ひととおり言語を習得してから検討するとよい。

  1. 普通の Windows 版 Python
    1. python-2.5.2.msi をダウンロードして実行する。 選択肢はすべてデフォルトどおりでよい。
    2. C:\Python25\Lib\site-packages\ に次のテキストファイル sitecustomize.py を作る。
      import sys
      sys.setdefaultencoding('cp932')
      
      テキストの改行コードは Windows 標準の \r\n でも Unix 形式の \n でもよい。 このファイルが Python に認識されているかどうかは,Python の実行後, sitecustomize.py と同じ場所に sitecustomize.pyc が自動生成されているかどうかで確認できる。

      sys.setdefaultencoding 関数は画面入出力以外での Unicode の変換方法を指定する。 たとえば,画面出力をリダイレクトする場合も含め, Unicode 文字列をファイルに出力するときの Unicode からバイト文字列への デフォルトの変換方法を決める。 一方,画面入出力での変換方法は Python が OS から情報を取得して自動的に決定する。 日本語 Windows では 'cp932', つまり Shift_JIS の Windows 版バリアントになる (cf. sys.stdout.encoding, sys.stdin.encoding)。 上記で sys.setdefaultencoding 関数に 'cp932' を与えているのは, 画面入出力との振舞の一貫性を保つためである。 関数 sys.setdefaultencoding は,Python の起動スクリプト C:\Python25\Lib\site.py により sitecustomize.py の実行後,削除される。 sitecustomize.py はユーザが同関数を正当な手段で呼び出せる唯一の場所である。

      [私見では,現行の Python の文字エンコーディング決定方法は, 煩雑だが肝腎なところで用をなさない,まずい設計です。 何も設定しない状態では, 例えば,出力をファイルにリダイレクトしようとするだけで, 非 ASCII 文字についての情報が例外発生によって非可逆的に失われます。 たとえ見かけ上「文字化け」しても, 何らかの意味で可逆ならばまだ有用性がありますが,情報が失われてしまったらそれで終わりです (私たちはこのことを日常的に経験しているはずです)。 しかし,だからといって Python のすべてを否定することは賢明ではありません。 Python に足りないのはあと一歩の洞察力と仕上げだけで, ほとんどのところは水準以上にきっちり作られています。 さしあたり,上記のように設定すれば,実用上,どうということはありません]


    3. IDLE (Python GUI) の Default Source Encoding は初期設定どおり None のままにする。

      この資料の当初の記述では,下図のように Default Source Encoding として UTF-8 を選ぶことを勧めていた。そして,その理由として 「統合開発環境 IDLE での新規作成ファイルが BOM 付き UTF-8 になるから, 煩雑な文字 coding 指定を省略できる。 実行速度もわずかに有利になる」 と述べていた。この理由は今も妥当である。 そして,この設定はこれからの Python の動向にも一致している (PEP 3120: Using UTF-8 as the default source encoding)。

      しかし,今のところ,初心者にとって UTF-8 の選択はかえって学習の ハードルを無駄に高くしている面がある (バイト文字列に対する IDLE の奇妙な振舞 を参照。 記事では Python 2.5.1 が使われているが Python 2.5.2 でも同様である)。 おそらく Python 2.6, 3.0 の登場までは初心者用の設定として None のままにすることが適切であろう。

      None の場合, 非 ASCII 文字を含むファイルをセーブしようとすると 下図のようなダイアログが現れる (図は Python 2.5.1 だが Python 2.5.2 でも同様である)。 ここで Edit my file ボタンを押すと, # -*- coding: cp932 -*- が自動的に先頭に差し入れられる。 この行はコメント行だが, 同ファイルが文字エンコーディングとして cp932 を使うことを Python の字句解析器に対して宣言する。

      Python に対する宣言としては妥当だから, さしあたりは,この自動追加された行をそのまま使うとよい。

      ただし,恥ずかしくない Python プログラムとして公開したいときは, cp932 という指定は避けるのが無難である。 いわゆる機種依存文字などの微妙な文字を含んでない限り-*- coding: cp932 -*- ではなく -*- coding: shift_jis -*- とするとよい。 ここで指定が好ましいかどうかの基準は,Python だけでなく Python ファイルの編集ツールとして広く使われているテキストエディタ Emacs からも認識できるかどうかである。
      PEP 263 で「Emacs スタイル」と参照されているように, この形式の宣言は Emacs の同種の宣言と共通である。 従来,Emacs のためにコメントに書かれていた宣言に Python が便乗したわけであり,それが, Python の用語法に反して,encoding ではなく coding としている理由である。 しかし,現在よく使われているバージョンの Emacs は cp932 を理解しない。 shift_jis ならば (尊敬すべき日本の先人の貢献により) バニラな GNU Emacs でも理解する。
      Emacs 使いであることが必ずしも Python 使いであるための必要条件ではないし, そもそも Emacs は,認識できない宣言ならば無視して, 概ね実用的な精度で文字コードの自動判定を行う。 したがって,このことは絶対的な要請ではない。 (誤解を恐れずに言えば) 便乗者としてのたしなみの問題である。
      なお,はじめから自動的にそう書かれた行を追加するように, Python で書かれた IDLE のソースを読んで改造することは, 初心者レベル卒業の実力テストとして適切であろう。

      IDLE を Emacs 互換のキー操作にするには,General タブのとなりにある Keys の "Select a Key Set" で "IDLE Classic Unix" を選択する。

      IDLE を終わらせるには,File ⇒ Exit などを行う。

      IDLE のユーザ設定は (%HOME% が未定義ならば) %HOMEDRIVE%%HOMEPATH%.idlerc フォルダにある。 すべてを初期設定の状態に戻したいときは,このフォルダを消せばよい。

    Unix 版 Python

    Unix 版 Python も同様の設定でよい。ただし, /usr/local/lib/python2.5/ などの site-packages/sitecustomize.py には 'cp932' のかわりに 'utf-8' や 'euc-jp' などを指定する。

    Python の標準入出力は, この指定とは別にシステムのデフォルト・エンコーディングを, C ライブラリの API を通じて取得し,使用する。 したがって,API が適切に動作できるように,必要に応じ, 実態に合わせて環境変数 LC_ALL または LANG などを設定する必要がある。

    シェルスクリプトの互換性を維持するため従来の英語環境のまま UTF-8 端末を利用したい場合は,環境変数値として ("ja_JP.UTF-8" ではなく) "en_US.UTF-8" を試すとよい。 コマンドシェルとして bash を利用する場合, その起動に環境変数を設定するようにすると, python だけでなく bash の行編集機能もマルチバイト文字を認識するから,より実用的である。

    ~/.inputrc については,必要ならば下記 Cygwin と同様に設定する。

  2. Cygwin 版 Python
    1. Cygwin インストーラ setup.exe で "python" パッケージを選択して インストールする。
    2. /usr/lib/python2.5/site-packages/ に次のテキストファイル sitecustomize.py を作る。
      from encodings import alias
      aliases.aliases['us_ascii'] = 'cp932'
      
      import sys
      sys.setdefaultencoding('cp932')
      

      Unix 類としては異端だが, 今のところ Cygwin はそれ自体としては環境変数 LC_ALL, LANG 等を参照しない。 今の Cygwin でこれらの環境変数にしたがって振舞を変えるコマンドは, Unix プログラムとしては行儀が悪いが, setlocale 等の API による正攻法をとらずに (というより,とれずに), 各自直接環境変数を読み取る苦肉の策に頼っている。

      Cygwin にあって,正攻法にしたがって標準的な C ライブラリに依存しようとする Python は,文字のエンコーディングが US-ASCII に固定される。 コンソール入出力で漢字等を使えるようにするには,奇策だが, 内部テーブルを書き換えて US-ASCII を cp932 にすげかえざるを得ない。 それが, aliases.aliases['us_ascii'] = 'cp932' の意味である。

      sys.setdefaultencoding('cp932') の 'cp932' は, Unix 類との相互運用性を重視する場合, 'shift_jis' にするとよい。詳しくは Life with Cygwin 15.2-3 参照。

      UTF-8 Cygwin を利用するときは, sitecustomize.py の2箇所の 'cp932' をそれぞれ 'utf_8' と 'utf-8' に変更するとよい。

      from encodings import alias
      aliases.aliases['us_ascii'] = 'utf_8'
      
      import sys
      sys.setdefaultencoding('utf-8')
      
    3. ~/.inputrc に下記が含まれることを確認する。
      set convert-meta off
      set output-meta on
      

      行編集機能として bash や gdb と同じく readline ライブラリを利用するから, この設定がないとコンソール入出力で日本語を使用できない。

    Cygwin 版 IDLE は /usr/bin/idle としてインストールされる。 X11 は必要ない。 idle を実行するときは,あらかじめ rebaseall をしておかないとプロセス生成に失敗することがある。 いずれにせよ現在はメニューバーが出ない等の不具合があり,実用的ではない。

  3. IronPython
    1. .NET Framework 2.0 をインストールしておく。 普通の Windows 版 Python か,Cygwin 版 Python の少なくともどちらかを インストールしておく。
    2. IronPython-1.1.1-Bin.zip を適当なディレクトリに展開する。

      Cygwin の unzip で展開したときは忘れずに実行パーミッションを立てること。

      $ cd IronPython-1.1.1
      $ chmod a+x *.exe *.dll
      
    3. 展開した IronPython-1.1.1 下にある Lib ディレクトリには現在 site.py だけがある。 初期状態では, IronPython-1.1.1 下の DLLs ディレクトリにある dll ファイルからクラスを import できるように準備するコードが用意されている (ただし初期状態では DLLs ディレクトリがないため,何もしない)。 site.py の末尾に下記を追記する。
      sys.path.append('C:/Python25/Lib')
      sys.setdefaultencoding('cp932')
      

      これは Windows 版 Python 2.5 をインストールしてある場合の例である。 Cygwin 版 Python をインストールしてある場合は下記を追記する。

      sys.path.append('C:/cygwin/lib/python2.5')
      sys.setdefaultencoding('cp932')
      

      sys.path.append(...) により Python 標準ライブラリのうち, Python 自身で実装されているものが利用可能になる。 とりわけ利用頻度の高い os モジュールが利用可能になる。 IronPython 本体が下請けモジュール nt を用意しているからである。

      注: IronPython 1.0.1 以前から Python 2.5.* の標準ライブラリを利用する場合, バージョン間の非互換性による問題が発生していた。詳しくは IronPython と Python 標準ライブラリについての注意 を参照。 ただし,Python 2.5 対応が進んだ現行の IronPython ならば Python 2.5.* の標準ライブラリを利用しても特に問題はない

      IronPython の文字列はすべて Unicode 文字列である。 テキスト・モードで文字化けせずにファイル入出力を行うには sys.setdefaultencoding(...) の設定が欠かせない。 IronPython 1.0 以前では 'cp932' は受理されなかった。 IronPython 1.0.1 以降 'shift_jis' と 'cp932' は同じ意味であり,交換可能である。

      sys.setdefaultencoding 関数は1回のインタープリタ実行で一度しか実行できない。 従来の Python と同じく, 実行環境の実態に合わせて各自が初期設定ファイルで使用することを仮定している。 したがって,一般のスクリプトやモジュールから呼び出してはならない。

    4. 必要に応じ,展開した IronPython-1.1.1 ディレクトリに PATH を通す。 または PATH の通った場所に次の五つをコピーする。
      1. ipy.exe
      2. ipyw.exe
      3. IronPython.dll
      4. IronMath.dll
      5. Lib

      ipy.exe はインタープリタ, ipyw.exe はコンソールを出さないインタープリタ (GUI スクリプトに利用), IronPython.dll はインタープリタの実体 (C# プログラムから利用可能), IronMath.dll は BigInteger や複素数のライブラリ, Lib は IronPython 用ライブラリをおさめるディレクトリである。

      プライベートアセンブリだから,一つのディレクトリにまとめる必要がある。 DLLs ディレクトリを設けている場合はそれも同じ場所におく。

      コマンドラインとして専ら Cygwin を利用する場合, 直接 PATH を通すかわりに PATH の通った場所から ipy.exe と ipyw.exe へシンボリックリンクをはるだけでよい

      $ cd /usr/loca/bin
      $ ln -s /cygdrive/c/IronPython-1.1.1/ipy.exe .
      $ ln -s /cygdrive/c/IronPython-1.1.1/ipyw.exe .
      

Python プログラム・ファイル

sitecustomize.py など,Python プログラムのファイルは py を接尾辞とする。 改行コードは \r\n でも \n でもよい。 ファイルをモジュールとして実行したとき,python は同じディレクトリに pyc を接尾辞とするバイトコンパイル済みのファイルを 生成する (python を実行後, sitecustomize.py のとなりに sitecustomize.pyc が生成されるのは,このためである)。

ファイルの内容に 漢字・かな などの非 ASCII 文字を含めるときは次が必要である:

  1. ファイルを BOM 付き UTF-8 にするか,
  2. 先頭の1行目か2行目のコメントに -*- coding: shift_jis -*- などと書く。 例:
    # -*- coding: utf-8 -*- Copyright (c) 1998, 2006 OKI Software Co., Ltd.
    

これは,コメントだけに漢字を使うときも例外ではない。 一般に文字のエンコーディングが不明のとき, 必ずしも正しく字句解析できないからである。 実際には,ほとんどの場合,字句解析に不都合は出ないが, Python はさしあたり (臆病なまでに) 安全側に倒して, 不明なものを受理しないようにしている。

エンコーディング名は utf-8, shift_jis, euc-jp, iso-2022-jp のように略さずに書くのが無難である。今のところ,sjis と書いても Python 2.4 以降には受理されるが IronPython には受理されない。








以下の内容は IronPython 1.0.1 付属の Tutorial 1: Basic IronPython をベースにしている。

対話セッション

  1. 対話セッションを開始する。
    • スタート ⇒ すべてのプログラム ⇒ Python 2.5 で "IDLE (Python GUI)" を選ぶか,"Python (command line)" を選ぶ。 または
    • コマンドシェルから python または ipy を起動する。
      $ ipy
      IronPython 1.1.1 (1.1.1) on .NET 2.0.50727.1433
      Copyright (c) Microsoft Corporation. All rights reserved.
      >>> _
      
  2. 下記の単純文を実行してみる。
    Python は各文の入力に対し,もし (None 以外の) 結果があれば表示し,次の入力を待つ。
    5 + 6
    None
    print 'hello, world'
    for i in range(3): print i
    x = 2+3j
    print x
    

    実行後,コンソールは次のようになっているはずである。 for で始まる入力行では「for ループ」の終わりを知らせるために, 1回余分に Enter キーを打鍵する。

    >>> 5 + 6
    11
    >>> None
    >>> print 'hello, world'
    hello, world
    >>> for i in range(3): print i
    ...
    0
    1
    2
    >>> x = 2+3j
    >>> print x
    (2+3j)
    >>> 
    

    最後の例で j は虚数単位である。

  3. 加算関数 "add" を定義してみる。
    C/C#/Java と異なり, Python は波カッコではなく字下げ (indentation) でコードをブロック化する。 1段深いブロックは,1段深い字下げで表現される。

    プロンプト ... は複数行からなる文の入力を示すために使われる。 IDLE では ... が出ないかわりに, Enter とともに自動字下げされる。

    return 文の前の字下げは飾りではなく必須である。 for ループと同じくここも最後に1回余分に Enter キーの打鍵が必要である。

    def add(a, b):
        return a + b
    
    add(5, 6)
    add('brac', 'ket')
    
    >>> def add(a, b):
    ...     return a + b
    ... 
    >>> add(5, 6)
    11
    >>> add('brac', 'ket')
    'bracket'
    >>> 
    

    各ブロックの字下げの深さは自由であるが, 特に理由がなければ 4 文字ごとにする。 TAB は 8 文字換算固定である。 特に理由がなければ,永続的なファイル上の表現としては, 空白だけで字下げを行うのが好ましい (4 TAB 環境などにファイルを持っていくと,見掛けと意味が食い違うから)。

  4. EOF 文字を打鍵して,セッションを終わらせる。

    ただし IDLE ではメニューバーの File ⇒ Exit などで終了する。

    Windows 版 Python, IronPython では Ctrl+Z (または F6 を押してから Enter) を打鍵する。

    Cygwin 版 Python を含む Unix 上の Python では通常 Ctrl+D を打鍵する。

組込みモジュールと対話的な探索

  1. セッションを開始する。
  2. 組込み関数 dir() を使って環境の内容をリストする。
    dir()
    
    >>> dir()
    ['__builtins__', '__doc__', '__name__', 'site']
    >>> 
    

    ※ site が環境に含まれるのは IronPython 固有の特徴である。

  3. sys を import する。

    sys (システムの意) は最もよく使われる組込みモジュールの一つである。

    import sys
    
    >>> import sys
    >>> 
    
  4. import したモジュール内の名前にアクセスする。
    sys.version
    
    >>> sys.version
    '2.4.0 (IronPython 1.1.1 (1.1.1) on .NET 2.0.50727.1433)'
    >>> 
    
  5. 組込み関数 dir() を使って環境を確認する。

    環境に sys が増えている。

    >>> dir()
    ['_', '__builtins__', '__doc__', '__name__', 'site', 'sys']
    >>> 
    

    ※ _ も増えているのは IronPython 固有の特徴である。 _ は対話的環境での便宜のため直前の結果の値を保持する変数である。 _ は普通の python では組込み関数・変数のモジュールである __builtins__ に格納されており,dir() だけでは現れない。

  6. 組込み関数 dir() を使ってモジュール sys の中身を探索する。
    dir(sys)
    
    >>> dir(sys)
    ['__class__', '__doc__', '__init__', '__module__', '__name__', '__new__', '__red
    uce__', '__reduce_ex__', '__repr__', '__stderr__', '__stdin__', '__stdout__', '_
    _str__', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder'
    , 'copyright', 'displayhook', 'exc_clear', 'exc_info', 'exc_traceback', 'exc_typ
    e', 'exc_value', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckint
    erval', 'getdefaultencoding', 'getfilesystemencoding', 'getrecursionlimit', 'get
    refcount', 'hexversion', 'maxint', 'maxunicode', 'modules', 'path', 'platform', 
    'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setrecursionlimit', 'settrace', 'st
    derr', 'stdin', 'stdout', 'version', 'version_info', 'warnoptions', 'winver']
    >>>
    
  7. sys モジュールの他の属性を参照してみる。
    sys.path
    sys.platform
    sys.argv
    
    >>> sys.path
    ['c:\\Documents and Settings\\ap044042', 'c:\\IronPython-1.1.1\\Lib', 'C:/Python25
    /Lib']
    >>> sys.platform
    'cli'
    >>> sys.argv
    []
    >>> 
    

    sys.path はモジュールを検索するパスである。 その先頭要素はカレントディレクトリである。

    sys.platform は,この Python 実装が動作しているプラットフォーム名である。 プラットフォームで場合分けするときに参照する。

    sys.argv はコマンド行引数のリストである。 ここでは空リストである。

  8. site モジュールの出自を確認する (※IronPython のみ)
    dir(site)
    site.__file___
    
    >>> dir(site)
    ['Directory', 'FileInfo', 'Path', '__builtins__', '__dict__', '__doc__', '__file
    __', '__name__', 'clr', 'dir', 'sys']
    >>> site.__file__
    'c:\\IronPython-1.1.1\\Lib\\site.py'
    >>> 
    

    導入時に編集した site.py がモジュールとして読み込まれていることが分かる。

リスト

Python には Java や C# の ArrayList に相当するデータ型が組み込まれている。 それがリスト (list) である。 これまで sys.path, sys.argv の値,dir() の戻り値としてリストを見てきた。

  1. リストを作って操作する。
    [1, 2, 3, 4, 5]
    x = [1, 2, 3, 4, 5]
    x[0]
    x[-1]
    x[1:3]
    x[:3]
    x[3:]
    for e in x: print e
    x[3] = 100
    x.append(200)
    len(x)
    isinstance(x, list)
    
    >>> [1, 2, 3, 4, 5]
    [1, 2, 3, 4, 5]
    >>> x = [1, 2, 3, 4, 5]
    >>> x
    [1, 2, 3, 4, 5]
    >>> x[0]
    1
    >>> x[-1]
    5
    >>> x[1:3]
    [2, 3]
    >>> x[:3]
    [1, 2, 3]
    >>> x[3:]
    [4, 5]
    >>> for e in x: print e
    ...
    1
    2
    3
    4
    5
    >>> x[3] = 100
    >>> x
    [1, 2, 3, 100, 5]
    >>> x.append(200)
    >>> x
    [1, 2, 3, 100, 5, 200]
    >>> len(x)
    6
    >>> isinstance(x, list)
    True
    >>> 
    
  2. 同じオブジェクト?

    リストのスライス x[i:j] の i を省くと先頭から,j を省くと末尾まで。 したがって両方を省いた x[:] は x のコピーを作る。

    2項演算子 is は,両辺が同一のオブジェクトならば True。
    2項演算子 == は, 両辺が (たとえ たまたま でも) 同じ値のオブジェクトならば True。

    x[:]
    x is x
    x is x[:]
    x == x
    x == x[:]
    
    >>> x
    [1, 2, 3, 100, 5, 200]
    >>> x[:]
    [1, 2, 3, 100, 5, 200]
    >>> x is x
    True
    >>> x is x[:]
    False
    >>> x == x
    True
    >>> x == x[:]
    True
    
  3. dir() は,リストを作って返す関数。
    >>> dir()
    ['_', '__builtins__', '__doc__', '__name__', 'e', 'site', sys', 'x']
    >>> y = dir()
    >>> y is dir()
    False
    >>> for e in y: print e
    ...
    _
    __builtins__
    __doc__
    __name__
    e
    site
    sys
    x
    >>> isinstance(y, list)
    True
    >>> 
    
  4. 型の名前の関数は,コンストラクタ。

    型と同じ名前のオブジェクトは, 普通,そのコンストラクタとなるように定義されている。 list も例外ではない。

    list
    list('abc')
    
    >>> list
    <type 'list'>
    >>> list('abc')
    ['a', 'b', 'c']
    >>>
    
  5. dir() でメソッドや属性を一覧する。

    モジュールを dir() に与えるとその関数等を一覧できたように, 型やそのオブジェクトを dir() に与えるとそのメソッド等を一覧できる。

    >>> dir(list)
    ['__add__', '__class__', '__contains__', '__delitem__', '__delslice__', '__doc__
    ', '__eq__', '__getitem__', '__getslice__', '__hash__', '__iadd__', '__imul__',
    '__init__', '__iter__', '__len__', '__module__', '__mul__', '__ne__', '__new__',
     '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setitem__', '__setsli
    ce__', '__str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove
    ', 'reverse', 'sort']
    >>> dir(list) == dir([])
    True
    >>> 
    
  6. len と __len__

    組込み関数 len() は引数の長さ (length) を返す。 実は len() は引数の内部実装メソッド __len__ を実行している。 リスト x に対し,len(x) と x.__len__() は同じ結果になる。

    len(x) == x.__len__()
    
  7. i で始まるメソッドは?
    [ e for e in dir(list) if e.startswith('i') ]
    
    >>> [ e for e in dir(list) if e.startswith('i') ]
    ['index', 'insert']
    >>> 
    
  8. .NET のメソッドを使う (※ IronPython のみ。非公式)

    ※ ここで説明する機能を明文化した文書が見当たらないため, 将来の版の IronPython では突然サポートされなくなる可能性がある。 シリアスな用途にこの機能を使うことは,現状ではあまり安全ではない。

    clr を import する,あるいは System 等の .NET 名前空間を import すると, (それまでの封印が解かれて) Python のリストを実装している .NET のメソッドが利用可能になる。 つまり,IList や IList<object> のメソッドが利用可能になる。 文字列など他のデータ型も同様である。

    どのように Python のリストが .NET で実装されているかについては, IronPython のバイナリと同様に配布されているソースの IronPython-1.1.1/Src/IronPython/Runtime/List.cs を参照せよ。

    import clr
    dir(list)
    i = [3, 1, 4].GetEnumerator()
    i.MoveNext()
    i.Current
    
    >>> import clr
    >>> dir(list)
    ['Add', 'AddSequence', 'Append', 'Clear', 'CompareTo', 'Contains', 'ContainsValu
    e', 'CopyTo', 'Count', 'DeleteItem', 'DeleteSlice', 'Equals', 'Extend', 'Finaliz
    e', 'GetDynamicType', 'GetEnumerator', 'GetHashCode', 'GetLength', 'GetObjectArr
    ay', 'GetSlice', 'GetType', 'InPlaceAdd', 'InPlaceMultiply', 'Index', 'IndexOf',
     'Initialize', 'Insert', 'IsFixedSize', 'IsReadOnly', 'IsSynchronized', 'ListEnu
    meratorCollection', 'Make', 'MakeDynamicType', 'MakeEmptyList', 'MakeList', 'Mem
    berwiseClone', 'MultiplySequence', 'Pop', 'Reduce', 'ReferenceEquals', 'Remove',
     'RemoveAt', 'Reverse', 'ReverseMultiply', 'RichEquals', 'RichGetHashCode', 'Ric
    hNotEquals', 'SetSlice', 'Sort', 'SyncRoot', 'ToCodeString', 'ToString', '__add_
    _', '__class__', '__contains__', '__delitem__', '__delslice__', '__doc__', '__eq
    __', '__getitem__', '__getslice__', '__hash__', '__iadd__', '__imul__', '__init_
    _', '__iter__', '__len__', '__module__', '__mul__', '__ne__', '__new__', '__redu
    ce__', '__reduce_ex__', '__repr__', '__rmul__', '__setitem__', '__setslice__', '
    __str__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reve
    rse', 'sort']
    >>> i = [3, 1, 4].GetEnumerator()
    >>> i.MoveNext()
    True
    >>> i.Current
    3
    >>> i.MoveNext()
    True
    >>> i.Current
    1
    >>> i.MoveNext()
    True
    >>> i.Current
    4
    >>> i.MoveNext()
    False
    >>> 
    
  9. いったん,セッションを終了する。

タプル

タプルの例: (1, 2, 3)
長さ 0 のタプル: ()
長さ 1 のタプルの例 (カンマに注意): (4,)

タプル (tuple) はリストと似ているが, 一度作ったら内容を変更できないかわりに, ごく軽量に使えるオブジェクトである。 長さ 0 の場合を除き,紛わしくなければ,丸カッコは省略してよい。 典型的には関数から複数の値を返すときなど, (深い意味を持たせることなく) 値を組にして渡すときに使う。

代入の右辺がタプルのとき,左辺を変数からなる同じ長さのタプルにしてよい。 代入は一度に行われる。

>>> (a, b) = (10, 20)
>>> (a, b)
(10, 20)
>>> (a, b) = (b, a)
>>> (a, b)
(20, 10)

外部 Python モジュール

  1. カレントディレクトリに UTF-8 ファイル my_test.py を用意して, 対話セッションを始める。
    # -*- coding: utf-8 -*-
    
    def add(a, b):
        "add(a, b) -> (a + b)"
        return a + b
    
    def factorial(n):
        u"factorial(n) -> n の階乗"
        if n <= 1:
            return 1
        else:
            return n * factorial(n - 1)
    
    msg = u"Python から 'こんにちは'"
    

    BOM 付き UTF-8 ファイルならば先頭の -*- coding: utf-8 -*- は省略可能である。 shift_jis や euc-jp を使うときは -*- coding: utf-8 -*- の utf-8 の箇所をあわせて変更する。 改行コードは \r\n でも \n でもよい。 言語仕様として Python は TAB を 8 文字換算するから,プラットフォーム間の可搬性のために, 字下げは空白文字だけで行うのが無難である。

    文字列をシングルクォートのかわりにダブルクォートで囲んでもよい。 両者は全く同じ意味であり,自由に交換できる。 シングルクォートで囲んだときは,文字列中にダブルクォートがエスケープなしに出現できる。 ダブルクォートで囲んだときは,文字列中にシングルクォートがエスケープなしに出現できる。

    文字列に u を接頭すると Unicode 文字列と解釈される。 Unicode 文字列ならば, 実行環境が euc-jp であっても,shift_jis であっても, それぞれ適切にエンコードして表示できるから, 改行コードの自由度とあいまって, 同一ファイルを変換なしでそのまま様々な環境で利用できる。 特に理由がなければ,ファイル中の 非 ASCII 文字を含む文字列リテラルは u を接頭して Unicode 文字列にするとよい。

    ただし, IronPython は u を接頭してもしなくても, すべて Unicode 文字列になる。 Python の進化の方向の先取りであるとともに, .NET との親和性のためでもある。 画像などのバイナリ・ファイルについては, バイナリ・モードのとき Unicode 文字の下位1バイトだけを使うことで 従来との互換性を維持している。

    例:
    rf = file('image.jpg', 'rb'); data = rf.read(); rf.close()
    ここで file はファイル型の型名であり, したがってファイル・オブジェクトを作るコンストラクタである。 引数 'image.jpg' はファイル名, 引数 'rb' は読取り (read) 用,バイナリ (binary) モードでファイルを開くことを指示する。 data = rf.read() はファイル・オブジェクトからデータを文字列として読み取り, data に代入する。


    file について: Python の進化の方向として, 型名 file をコンストラクタとして使うかわりに,(将来仕様として) 細分化された各種ファイル・クラス を引数にもとづき自動的に選択し,インスタンスを構築する (ようにできる) 総称的な open 関数を使う傾向にある。将来的には file は抽象基底クラスとなり,コンストラクタとしては 呼び出せなくなるかもしれない。 open 関数の引数は,コンストラクタとしての file と同じである。 これは表面的には open 関数だけがあった大昔の仕様への先祖返りであり,おそらくその理由から, file を型名ではなく総称関数名にする,というもう一つの選択は採られなかったと見られる。

  2. my_test.py をモジュールとして import する。
    import my_test
    dir(my_test)
    
    >>> import my_test
    >>> dir(my_test)
    ['__builtins__', '__dict__', '__doc__', '__file__', '__name__', 'add', 'factoria
    l', 'msg']
    >>>
    

    ※ ここで __dict__ が現れるのは IronPython 固有の特徴である。

  3. 関数 add と factorial のドキュメンテーション文字列を見てみる。
    my_test.add.__doc__
    my_test.factorial.__doc__
    print my_test.factorial.__doc__
    help(my_test.factorial)
    help(my_test)
    
    >>> my_test.add.__doc__
    'add(a, b) -> (a + b)'
    >>> my_test.factorial.__doc__
    u'factorial(n) -> n \u306e\u968e\u4e57'
    >>> print my_test.factorial.__doc__
    factorial(n) -> n の階乗
    >>> help(my_test.factorial)
    Help on function factorial in module my_test
    
     |  factorial(n)
     |      factorial(n) -> n の階乗
    
    >>> help(my_test)
     |      add(a, b)
     |          add(a, b) -> (a + b)
     |      factorial(n)
     |          factorial(n) -> n の階乗
    
    >>>
    

    help() は関数やモジュールのドキュメンテーション文字列を見やすく表示する。 日本語文字が正しく表示されないときは,ファイル先頭の -*- coding: utf-8 -*- が適切に書かれていることを確かめるとよい。

  4. 関数 add と factorial を呼び出し,属性 msg を見てみる。
    my_test.add(2, 3)
    my_test.factorial(10)
    my_test.factorial(100)
    my_test.msg
    print my_test.msg
    
    >>> my_test.add(2, 3)
    5
    >>> my_test.factorial(10)
    3628800
    >>> my_test.factorial(100)
    93326215443944152681699238856266700490715968264381621468592963895217599993229915
    608941463976156518286253697920827223758251185210916864000000000000000000000000L
    >>> my_test.msg
    u"Python \u304b\u3089 '\u3053\u3093\u306b\u3061\u306f'"
    >>> print my_test.msg
    Python から 'こんにちは'
    >>>
    

    100 の階乗のように整数の桁があふれるときは, 自動的に無限多倍長整数 (Python での型名は long) に拡張される。 long 値は L の接尾によって区別できる。

  5. セッションを終わらせる。

os モジュール

os モジュールには,普通,シェル・スクリプトやバッチ・ファイルで行うような ファイル操作,ディレクトリ操作,環境変数操作,プロセス操作等がおさめられている。 一部を示す。

import os
os.getcwd()
os.chdir('..')
os.listdir('.')
os.environ

辞書

os.environ は,環境変数とその値からなる連想配列である。 Python は一般的な連想配列型として辞書 (dict) 型を用意している。 現在の Python, IronPython の実装では,os.environ は辞書そのものではないが, 辞書に準じた振舞をする。

波カッコで囲むことで辞書を構築できる。

dd = {142: 'ひえい', 144: 'くらま', 123: 'しらゆき', 152: 'やまぎり'}
print dd[123]
print dd.get(123)
print dd.get(145)
print len(dd)
print dd.keys()
for key in dd: print key, dd[key]

print dd.setdefault(172, 'しまかぜ')
dd.update({174: 'きりしま', 102: 'はるさめ', 111: 'おおなみ'})
dd[178] = 'あしがら'
dd[153] = 'ゆうぎり'
del dd[152]
print len(dd)
print dd.keys()
for (key, val) in dd.iteritems(): print key, val

kk = dd.keys()
kk.sort()
for key in kk: print key, dd[key]

print dd.setdefault(102, 'ゆきかぜ')

辞書は配列のように参照できる。get メソッドで参照した場合, 存在しない項目に対し,例外を発生させずに (デフォルトでは) None を返す。 関数 len は (__len__ メソッドを呼び出して) 項目数を返す。 keys メソッドはキーのリストを返す。 for 文はキーに対してループする。

setdefault メソッドは get メソッドのように項目を参照するが, もし該当項目がなければ第2引数の値にセットしてその値を返す。 update メソッドは引数の辞書の各項目を代入する。 del 文は (__delitem__ メソッドを呼び出して) 項目を削除する。 iteritems メソッドはキーと値からなるタプルを次々と返すイテレータを作る。

リストの sort() メソッドは None を返すが, 副作用としてリストをその場でソートする。 上記の第3の for 文はキーをソートして表示する。

>>> dd = {142: 'ひえい', 144: 'くらま', 123: 'しらゆき', 152:'やまぎり'}
>>> print dd[123]
しらゆき
>>> print dd.get(123)
しらゆき
>>> print dd.get(145)
None
>>> print len(dd)
4
>>> print dd.keys()
[142, 144, 123, 152]
>>> for key in dd: print key, dd[key]
...
142 ひえい
144 くらま
123 しらゆき
152 やまぎり
>>> print dd.setdefault(172, 'しまかぜ')
しまかぜ
>>> dd.update({174: 'きりしま', 102: 'はるさめ', 111: 'おおなみ'})
>>> dd[178] = 'あしがら'
>>> dd[153] = 'ゆうぎり'
>>> del dd[152]
>>> print len(dd)
9
>>> print dd.keys()
[142, 144, 123, 172, 174, 102, 111, 178, 153]
>>> for (key, val) in dd.iteritems(): print key, val
...
142 ひえい
144 くらま
123 しらゆき
172 しまかぜ
174 きりしま
102 はるさめ
111 おおなみ
178 あしがら
153 ゆうぎり
>>> kk = dd.keys()
>>> kk.sort()
>>> for key in kk: print key, dd[key]
...
102 はるさめ
111 おおなみ
123 しらゆき
142 ひえい
144 くらま
153 ゆうぎり
172 しまかぜ
174 きりしま
178 あしがら
>>> print dd.setdefault(102, 'ゆきかぜ')
はるさめ
>>> 

IronPython から標準 .NET ライブラリを使う

これ以降は IronPython 固有のトピックである。 IronPython は .NET ライブラリにシームレスにアクセスできる。 ここではその方法を学ぶ。

  1. IronPython のセッションを開始する。
  2. .NET の System 名前空間を import する。
    import System
    
  3. System.Environment を見てみる。
    dir(System.Environment)
    System.Environment.OSVersion
    System.Environment.CommandLine
    
    >>> dir(System.Environment)
    ['CommandLine', 'CurrentDirectory', 'Equals', 'Exit', 'ExitCode', 'ExpandEnviron
    mentVariables', 'FailFast', 'Finalize', 'GetCommandLineArgs', 'GetEnvironmentVar
    iable', 'GetEnvironmentVariables', 'GetFolderPath', 'GetHashCode', 'GetLogicalDr
    ives', 'GetType', 'HasShutdownStarted', 'MachineName', 'MakeDynamicType', 'Membe
    rwiseClone', 'NewLine', 'OSVersion', 'ProcessorCount', 'Reduce', 'ReferenceEqual
    s', 'SetEnvironmentVariable', 'SpecialFolder', 'StackTrace', 'SystemDirectory',
    'TickCount', 'ToString', 'UserDomainName', 'UserInteractive', 'UserName', 'Versi
    on', 'WorkingSet', '__class__', '__doc__', '__init__', '__module__', '__new__',
    '__reduce__', '__reduce_ex__', '__repr__']
    >>> System.Environment.OSVersion
    <System.OperatingSystem object at 0x000000000000002B [Microsoft Windows NT 5.1.2
    600 Service Pack 2]>
    >>> System.Environment.CommandLine
    'c:\\IronPython-1.1.1\\ipy.exe'
    >>>
    

.NET クラスを使う

  1. System.Collections の内容を環境に import する。
    from System.Collections import *
    
  2. ハッシュ表 Hashtable のインスタンスを作ってみる。
    h = Hashtable()
    

    他と同じく, クラスと同じ名前の関数が,そのまま,そのクラスのコンストラクタである。

    >>> Hashtable
    <type 'Hashtable'>
    >>> h = Hashtable()
    >>> h
    <Hashtable object at 0x000000000000002C>
    >>> dir(h)
    ['Add', 'Clear', 'Clone', 'Contains', 'ContainsKey', 'ContainsValue', 'CopyTo',
    'Count', 'EqualityComparer', 'Equals', 'Finalize', 'GetEnumerator', 'GetHash', '
    GetHashCode', 'GetObjectData', 'GetType', 'IsFixedSize', 'IsReadOnly', 'IsSynchr
    onized', 'KeyEquals', 'Keys', 'MakeDynamicType', 'MemberwiseClone', 'OnDeseriali
    zation', 'Reduce', 'ReferenceEquals', 'Remove', 'SyncRoot', 'Synchronized', 'ToS
    tring', 'Values', '__class__', '__doc__', '__getitem__', '__init__', '__module__
    ', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setitem__', 'compare
    r', 'hcp']
    >>>
    
  3. ハッシュ表に要素を追加する。
    h["python"] = "2.3.5"
    h["os x"] = "10.4.11"
    

    C# と同じく, インデクサを定義したクラスのインスタンスは配列スタイルでアクセスできる。 インデクサは IronPython からは __setitem__, __gettem__ というメソッドとして参照される。

    ※ そもそも普通の Python では __setitem__, __gettem__ を用意すれば, そのクラスのインスタンスを配列スタイルで参照できた。

  4. ハッシュ表を for ループにかける。

    GetEnumerator メソッドをもつ IEnumerable なインスタンスは for ループにかけることができる。 「辞書」と異なり,キーではなく, Key と Value からなるオブジェクトでループする。 GetEnumerator メソッドの意味論がそのまま反映されているわけである。

    for e in h:
        print e.Key, e.Value
    
    >>> for e in h:
    ...     print e.Key, e.Value
    ...
    python 2.3.5
    os x 10.4.11
    >>>
    
  5. Python のリストやタプルを .NET のクラスに変換する。

    Python 本来のリストやタプルを引数にして .NET のコレクション・インスタンスを作成できる。 事実上,ArrayList などの リテラルの代用として利用できる。

    xs = ArrayList([1, 2, 3])
    for x in xs: print x
    
    >>> xs = ArrayList([1, 2, 3])
    >>> for x in xs: print x
    ...
    1
    2
    3
    >>> 
    

ジェネリクス

  1. System.Collections.Generic 名前空間の内容を取り込む。
    from System.Collections.Generic import *
    
  2. 文字列のリストを作る。
    ss = List[str]()
    

    str は Python の文字列型である。 IronPython では string と統合されている。Unicode 文字列になるゆえんである。

    >>> ss = List[str]()
    >>> print ss
    System.Collections.Generic.List`1[System.String]
    


  3. 要素を追加する。
    >>> ss.Add("Hello")
    >>> ss.Add("世界")
    >>> ss.Add(1)
    Traceback (most recent call last):
      File , line 0, in <stdin>##30
      File , line 0, in Add##29
    TypeError: Cannot convert int(1) to String
    >>> 
    
  4. for ループで内容をみる。
    >>> for e in ss: print e
    ...
    Hello
    世界
    >>> 
    
  5. いったん,セッションを終了する。

.NET ライブラリのロード

IronPython は,最もよく使われる .NET ライブラリしか直接 import できない。 その他の .NET ライブラリを使うには明示的な参照が必要である。 IronPython は,参照した全アセンブリのリストを保持している。 .NET アセンブリへの参照を追加するためには組込みモジュール clr の関数を使う。

  1. セッションを開始する。
  2. clr.AddReference で System.Xml を含むアセンブリへの参照を追加する。

    clr.References でアセンブリの参照のリストの内容を確認できる。

    import clr
    clr.AddReference("System.Xml")
    from System.Xml import *
    clr.References
    

    clr.AddReference 関数は System.Reflection.Assembly オブジェクト または 文字列を引数としてとる。文字列引数は完全アセンブリ名であるか, 部分アセンブリ名であるか,ファイル名である。 clr.AddReference は対話セッションの便宜のための関数である。 ファイルに書くときは, 下記のような細分化された関数を使って意図を明確にするとよい。

    • 完全アセンブリ名で指定するときは
      clr.AddReferenceByName("System.Xml, Version=2.0.0.0, Culture=neutral, "
                             "PublicKeyToken=b77a5c561934e089")
      

      Python 一般の仕様として, 開きカッコがあるときは,閉じカッコまで自動的に論理行が継続する。 二つ並んだ文字列リテラルは (C 言語と同じく) コンパイル時に結合される。

    • 部分アセンブリ名で指定するときは
      clr.AddReferenceByPartialName("System.Xml")
      

      このときは正しいバージョンのアセンブリがロードされるとは保証されない。

    • DLL へのパス名で指定するときは
      clr.AddReferenceToFileAndPath("C:/WINDOWS/Microsoft.NET/Framework/"
                                    "v2.0.50727/System.XML.dll")
      

      これは sys.path への追加も行う。sys.path 上にある dll ファイルならば, clr.AddReferenceToFile が利用できる。


  3. XML 文字列から name 属性値を取り出してみる。
    xd = XmlDocument()
    xd.LoadXml("""
    <sample>
      <item name="foo" />
      <item name="bar" />
      <item name="baz" />
    </sample>
    """)
    nn = xd.SelectNodes("//@name")
    for n in nn: print n.Value
    
    >>> xd = XmlDocument()
    >>> xd.LoadXml("""
    ... <sample>
    ...   <item name="foo" />
    ...   <item name="bar" />
    ...   <item name="baz" />
    ... </sample>
    ... """)
    >>> nn = xd.SelectNodes("//@name")
    >>> for n in nn: print n.Value
    ...
    foo
    bar
    baz
    >>> 
    



Copyright (c) 2006 - 2008 OKI Software Co., Ltd.