Python.use(better) #list: step09 -- def __getitem__(self, key)

記事一覧 Python.use(better)《Python3.1》

def __getitem__(self, key)

《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

事例:モジュールを起動する

■ 全項目を確認する

対象になるメソッドを「確認」するには、関数 do を利用します。

$ python -i myList.py
>>> do()
...
 9: step09 -- def __getitem__(self, key)
■ 各項目を実行する

各ステップの「動作」を確認するには、関数 do の実引数を指定します。

>>> do(9)
...
>>> # ---------------------------------------- __getitem__
>>> s = myList("ABC"); s, len(s)
(['A', 'B', 'C'], 3)
    
'A'
'B'
'C'
IndexError: myList index out of range >>>

事例:コードの解説

def step09():
    """def __getitem__(self, key)"""

    class myList(object):
        def __iter__(self): ...

        def index(self, value):
            for i,e in enumerate(self):
                if e==value: return i
            else:
                s = self.__class__.__name__
                raise ValueError(
                    "ValueError: {0}.index(x): x not in {0}".format(s))

        def __getitem__(self, key):            #1:
            for i,e in enumerate(self):
                if i==key: return e
            else:
                s = self.__class__.__name__
                raise IndexError(
                    "IndexError: %s index out of range"%s)

    ## ----------------------------------------
    local = locals()
    tips = (
        "__init__",
        "append",
        "__len__",
        "__contains__",
        "count",
        "index",
        "__getitem__",
        )
    global dirs; local = locals()

    dirs += "__delitem__",
    for e in dirs:
        print(">>> #","-"*40,e)
        eval("ex_%s(SPEC, local)"%e)
《TIPS》メソッド __iter__ を定義すると、self と記述するだけで、それを実現する方法(how)に依存しない、抽象表現(what)が可能になります。
■ #1: 要素の位置
メソッド index は(最初に見つかった)要素 value のオフセット位置を獲得します。
        def index(self, value):
            for i,e in enumerate(self):
                if e==value: return i
            else:
                s = self.__class__.__name__
                raise ValueError(
                    "ValueError: {0}.index(x): x not in {0}".format(s))
リスト self の要素 e が引数 value と同値なら、
  • 制御変数 i の値をリターン値にします。
引数 value と同値のものが見つからないなら、
  • 例外 ValueError を生成するとともに、
  • クラスの名前 __class__.__name__ を含むエラーメッセージを出力します。
■ #2: 要素の参照
メソッド __getitem__ は、演算子 [] に呼応して、各要素の値を参照します。
        def __getitem__(self, key):            #1:
            for i,e in enumerate(self):
                if i==key: return e
            else:
                s = self.__class__.__name__
                raise IndexError(
                    "IndexError: %s index out of range"%s)
for に続く制御変数 i が引数 key と同値なら、
  • リスト self の要素 e をリターン値にします。
引数 key と同値のものが見つからないなら、
  • 例外 IndexError を生成するとともに、
  • クラスの名前 __class__.__name__ を含むエラーメッセージを出力します。
》こちらに移動中です《TOP

関連記事

Last updated♪2009/12/06