《30》削除:メソッド __delitem__〈Python 3.0 版〉
実録:はじめてのプログラミング《Python3.0》
削除:メソッド __delitem__
■ 概要
デザインパターンを学習するための題材として、連結リストを作成します。
組み込み型 list と同等の機能を実現することで、その理解を深めます。list を利用できる状況ならいつでも、これから作成するクラス myList で代用できることを目指します。
《Note》JPython1.1.x/Jython2.1.x 用に作成したセミナー課題を、Jython2.5 で再構成しました。
■ 関連記事
- INDEX〈Python〉
- INDEX〈Swing〉
- 実録 はじめての…《30》削除:メソッド __delitem__ - 続・ひよ子のきもち《Python2.x》
削除:メソッド __delitem__
組み込み型 list と同様に、del 文を利用して要素を削除できると便利です。
def ex___delitem__():
for i in range(4):
X = 's = myList("ABC"); s'
print(">>>",X)
eval(compile(X,"","single"))
X = 'del s[{0}]; s'.format(i)
print(">>>",X)
eval(compile(X,"(x_x)","single"))
その動作(仕様)を確認すると、
>>> ex___delitem__() >>> s = myList("ABC"); s ['A', 'B', 'C'] >>> del s[0]; s ['B', 'C'] >>> s = myList("ABC"); s ['A', 'B', 'C'] >>> del s[1]; s ['A', 'C'] >>> s = myList("ABC"); s ['A', 'B', 'C'] >>> del s[2]; s ['A', 'B'] >>> s = myList("ABC"); s ['A', 'B', 'C'] >>> del s[3]; s Traceback (most recent call last): ... raise IndexError("{0} assignment index out of range".format(s)) IndexError: myList assignment index out of range
先頭からのオフセット値を指定して(その位置にある)要素を削除できるのが分かります。ただし、範囲を越えるオフセット値を指定すると、例外 IndexError を生成して、エラーメッセージを出力します。そこで、
実現:メソッド __delitem__
メソッド list.__delitem__ に準拠したものを実現します。
class myList(object): ... def __delitem__(self, key): prev, node = self.head, self.head.next n = 0 while node: if n==key: prev.next = node.next del node break prev, node = node, node.next n += 1 else: s = self.__class__.__name__ raise IndexError("{0} assignment index out of range".format(s))
演算子 del に呼応して、各要素を削除する手段を提供します。局所変数 n が、指定した引数 key と同じ値になるとき、その直前のノードの後続 prev.next は、削除したいノードの後続 node.next と同じ値に再設定します。すると、削除したい直前のノードの後に、削除したい直後のノードが続くようになります。そして、指定したオフセット値にある、オブジェクト node を削除します。条件を満たす要素が見つからないときには、例外 IndexError を生成するとともに、エラーメッセージを出力します。