4.3. type, str, dir や他の組み込み関数を使う

Python は飛び抜けて有用な組み込み関数を少数揃えています. 他の全ての関数はモジュールに分配されています. これは他のスクリプト言語 (Visual Basic...ゲフンゲフン) のように言語の核となる部分が太り過ぎるのを防ぐための, 実に意図的な設計上の判断です.

4.3.1. type 関数

type 関数は任意のオブジェクトのデータ型を返します. 取り得る型は types モジュールに列挙されています. これは数種類の型のデータを扱う補助関数で役に立ちます.

Example 4.5. type 関数の紹介

>>> type(1)           1
<type 'int'>
>>> li = []
>>> type(li)          2
<type 'list'>
>>> import odbchelper
>>> type(odbchelper)  3
<type 'module'>
>>> import types      4
>>> type(odbchelper) == types.ModuleType
True
1 type 関数は何でも -- 本当に何でも -- 引数に取り, そのデータ型を返します. 整数, 文字列, リスト, 辞書, タプル, 関数, クラス, モジュール, 型でさえ引数に取れます.
2 type 関数は変数を引数に取れ, そのデータ型を返します.
3 type 関数はモジュールも引数に取れます.
4 オブジェクトの型と比較するために types モジュールの定数が使えます. すぐに分かりますが, これが info 関数がしていることです.

4.3.2. str 関数

str 関数はデータを文字列に変換します. 全てのデータ型は文字列に変換することができます.

Example 4.6. str 関数の紹介

>>> str(1)          1
'1'
>>> horsemen = ['war', 'pestilence', 'famine']
>>> horsemen
['war', 'pestilence', 'famine']
>>> horsemen.append('Powerbuilder')
>>> str(horsemen)   2
"['war', 'pestilence', 'famine', 'Powerbuilder']"
>>> str(odbchelper) 3
"<module 'odbchelper' from 'c:\\docbook\\dip\\py\\odbchelper.py'>"
>>> str(None)       4
'None'
1 たいていの言語には整数を文字列に変換する関数があるので, 整数のような単純なデータ型に対して str 関数は作用すると予想するかもしれません.
2 しかし, str 関数は任意の型の任意のオブジェクトに作用します. ここではちょっとしたもので作ったリストに作用しています.
3 str 関数はモジュールにも作用します. モジュールの文字列表現にはディスク上のパス名が含まれていることに注意してください. おそらくあなたの実行結果とは異なるでしょう.
4 些細だが重要な str 関数の動作は, Python の null 値である None に作用することです. 返り値は 'None' という文字列になります. すぐに分かりますが, info 関数でこの長所を利用しています.

info 関数の肝は強力な dir 関数です. dir は, モジュール, 関数, 文字列, リスト, 辞書...といった任意のオブジェクトの属性とメソッドのリストを返します.

Example 4.7. dir 関数の紹介

>>> li = []
>>> dir(li)           1
['append', 'count', 'extend', 'index', 'insert',
'pop', 'remove', 'reverse', 'sort']
>>> d = {}
>>> dir(d)            2
['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'setdefault', 'update', 'values']
>>> import odbchelper
>>> dir(odbchelper)   3
['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']
1 li はリストなので, dir(li) はリストの全てのメソッドのリストを返します. 返り値のリストには, メソッドそのものではなく文字列としてのメソッド名が入っています.
2 d は辞書なので, dir(d) は辞書のメソッド名のリストを返します. その中の少くとも 1 つ keys は見覚えがあるはずです.
3 ここが本当に面白いところです. odbchelper はモジュールなので, dir(odbchelper) はモジュールで定義されたあらゆるもののリストを返し, その中には __name____doc__ といった組み込みの属性や, その他の自作の属性やメソッドが全て含まれています. この例では, odbchelper はユーザが定義したメソッド, 2 章 で出てきた buildConnectionString 関数が 1 つだけあります.

最後に, callable 関数は任意のオブジェクトを引数に取り, そのオブジェクトが呼び出し可能だったら True を返し, そうでなければ False を返します. 呼び出し可能なオブジェクトには関数, クラスのメソッド, さらにクラス自身が含まれます. (クラスについてはさらに次の章で扱います.)

Example 4.8. callable 関数の紹介

>>> import string
>>> string.punctuation           1
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.join                  2
<function join at 00C55A7C>
>>> callable(string.punctuation) 3
False
>>> callable(string.join)        4
True
>>> print string.join.__doc__    5
join(list [,sep]) -> string

    Return a string composed of the words in list, with
    intervening occurrences of sep.  The default separator is a
    single space.

    (joinfields and join are synonymous)
1 (依然として多くの人は join 関数を使っていますが) string モジュールの関数は非推奨 (deprecated) です. しかし string モジュールには, 標準の全ての句読記号を並べた string.punctuation のような, 役に立つ定数が多くあります.
2 string.join は文字列のリストを1つの文字列に結合する関数です.
3 string.punctuation は呼び出し可能ではありません. それは文字列です. (文字列は呼び出し可能なメソッドを持っていますが, 文字列そのものは呼び出し可能ではありません.)
4 string.join は呼び出し可能です. それは 2 つの引数を取る関数です.
5 呼び出し可能なオブジェクトにはたいてい doc string があります. callable 関数をオブジェクトの属性に使うことで, 事前にオブジェクトについて何も知らなくとも, どれが選びたい属性 (メソッド, 関数, クラス) でどれが無視する属性 (定数など) なのかを判定することができます.

4.3.3. 組み込み関数

type, str, dir やその他全ての Python の組み込み関数は, __builtin__ と呼ばれる特別なモジュールにまとめられています. (前後に 2 つのアンダースコアが付いています.) 次のように考えてもらっても構いません. Python は起動時に自動的に from __builtin__ import * を実行し, 全ての“組み込み”関数を名前空間にインポートし直接使えるようにします.

このように考える利点は, __builtin__ モジュールの情報を取得することで, 組み込み関数や属性の情報にまとめてアクセスできることです. そして実はさ, Python には info という関数がありますよね. 今すぐ自身で実行してみて, リストをざっと眺めてください. 後でいくつかのさらに重要な関数たちに飛び込みます. (AttributeError のような, いくつかの組み込み例外クラスは既に見慣れているでしょう.)

Example 4.9. 組み込み属性と関数

>>> from apihelper import info
>>> import __builtin__
>>> info(__builtin__, 20)
ArithmeticError      Base class for arithmetic errors.
AssertionError       Assertion failed.
AttributeError       Attribute not found.
EOFError             Read beyond end of file.
EnvironmentError     Base class for I/O related errors.
Exception            Common base class for all exceptions.
FloatingPointError   Floating point operation failed.
IOError              I/O operation failed.

[...snip...]
Note
Python には素晴しいリファレンスマニュアルが付いているので, それをじっくり読んで Python が提供してくれている全てのモジュールについて学ぶべきです. しかし, 他のほとんどの言語ではモジュールの使い方を思い出すのにマニュアルや man ページに戻って調べるのに対し, Python は大部分が自己文書化されています.

組み込み関数についてさらに知るには