ソースコードの歩き方《IronPython》dict.keys
Python.use(better, src=”IronPython”) # ソースコードを散策する《記事一覧》
関連記事
→ map 演算 dom VDM++《16》Map に対する演算(1)
メソッド:dict.keys
メソッド keys は、写像における定義域〔domain〕に相当します。
>>> help(dict.keys)
Help on method_descriptor:keys(...)
D.keys() -> list of D's keys
これを見て「キー」要素を列挙したリストが得られるのが分かります。実際に、その動作を確認してみましょう。
>>> ex
{'A': 1, 'C': 3, 'B': 2}
>>> ex.keys()
['A', 'C', 'B']
ここでは、キー要素となる文字列を列挙したリストが得られます。ただし、キー要素は重複せずに、順不同となります。
>>> ex[None] = 0
>>> ex.keys()
['A', None, 'C', 'B']
また(必要なら)キー要素に None を指定できます。
ソースコード:keys()
(メソッド dict.keys に相当する)メソッド keys の定義を含む、ソースコードの断片を次に示します。
# IronPython-1.1.2/Src/IronPython/Runtime/Dict.cs
[PythonType("dict")]
public class Dict : ... IDictionary
メソッド keys では、メソッド DictOps.Keys の実引数に、this を指定しています。これは、内部クラス DictOps ですべての操作を実現しているので、それに自身 this の処理を委ねるためです。このとき(Dict のインスタンス)this は、インターフェース IDictionary の規定に従うものとします。
《参照》インターフェイス IDictionary:詳細は、http://msdn.microsoft.com/en-us/library/system.collections.idictionary.aspx を参照してください。
internal static class DictOps {
static object nullObject = new object();public static List Keys(IDictionary
public static object ObjToNull(object o) {
if (o == nullObject) return null;
return o;
}
静的メソッド Keys では、変数 l が、そのリターン値を扱うために、リスト List を保持します。すると、次のような構造が見えてきます。
List l = ... self.Keys ... // IDictionary.Keys
...
return l;
プロパティー IDictionary.Keys を利用しているのが分かります。
ここでは、どのようにしてリストが得られるか(how)は知らなくても、それを使ってなにをしたいか(what)を理解できれば、十分です。self.Keys と同じ要素を持つリストが欲しいときに、List.Make を利用するだけです。
インターフェース:ICollection
ここには、次に示す典型的な C# のイディオムが記述してあります。
for (int i = 0; i < collection.Count; i++) {
if (... collection[i] ...) {
...
break; // 適切な処理をしたらループを抜ける
}
}
インターフェース ICollection で規定したプロトコルに従って、添字 i を使って各要素を順に参照します。
静的フィールド nullObject は、None を表現するために用意した、唯一のインスタンス(Singleton)です。キー要素の中に None があるなら、これを null に変換します。静的メソッド DictOps.ObjToNull は、そのために用意してあります。キー要素は重複しないので、nullObject が見つかるとすぐに、break でループを抜けます。
事例:dict.keys を使って
>>> dirs = dict([(e,type(getattr(dict,e))) for e in dir(dict)])
>>> s = dirs.keys()
>>> s.sort(); s
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__',
'__eq__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__',
'__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__str__', 'clear', 'copy',
'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys',
'pop', 'popitem', 'setdefault', 'update', 'values']
組み込み関数 dir と同じ結果が得られます。
《ひよ子のきもち♪2008/08/20》