11.9. "linecache" --- テキストラインにランダムアクセスする
**********************************************************

**ソースコード:** Lib/linecache.py

======================================================================

"linecache" モジュールは、キャッシュ (一つのファイルから何行も読んでお
くのが一般的です) を使って、内部で最適化を図りつつ、Python ソースファ
イルの任意の行を取得するのを可能にします。 "traceback" モジュールは、
整形されたトレースバックにソースコードを含めるためにこのモジュールを利
用しています。

"tokenize.open()" 関数は、ファイルを開くために使用されます。この関数は
、 "tokenize.detect_encoding()" を使用してファイルのエンコーディングを
取得します。エンコーディングトークンが存在しない場合、デフォルトの
UTF-8 になります。

"linecache" モジュールでは次の関数が定義されています:

linecache.getline(filename, lineno, module_globals=None)

   *filename* という名前のファイルから *lineno* 行目を取得します。この
   関数は決して例外を発生させません --- エラーの際には "''" を返します
   (行末の改行文字は、見つかった行に含まれます)。

   *filename* という名前のファイルが見つからなかった場合、モジュールの
   、つまり、 "sys.path" でそのファイルを探します。 zipfileやその他の
   ファイルシステムでないimport元に対応するためまず *module_globals*
   の **PEP 302** "__loader__" をチェックし、そのあと "sys.path" を探
   索します。

linecache.clearcache()

   キャッシュをクリアします。それまでに "getline()" を使って読み込んだ
   ファイルの行が必要でなくなったら、この関数を使ってください。

linecache.checkcache(filename=None)

   キャッシュが有効かどうかを確認します。キャッシュしたファイルがディ
   スク上で変更された可能性があり、更新後のバージョンが必要な場合にこ
   の関数を使用します。 *filename* が与えられない場合、全てのキャッシ
   ュエントリを確認します。

linecache.lazycache(filename, module_globals)

   後々の呼び出しで *module_globals* が "None" となっていても、ファイ
   ルの形式でないモジュールの行を後から "getline()" で取得するのに十分
   な詳細を把握しておきます。 この関数により、モジュールの globals を
   無限に持ち運ぶ必要無しに、実際に必要な行まで

   バージョン 3.5 で追加.

以下はプログラム例です:

   >>> import linecache
   >>> linecache.getline(linecache.__file__, 8)
   'import sys\n'
