ソースコード:FromKeys(DynamicType, object, object)

(メソッド dict.fromkeys に相当する)メソッド FromKeys の定義を含む、ソースコードの断片を次に示します。

# IronPython-1.1.2/Src/IronPython/Runtime/Dict.cs
[PythonType("dict")]
public class Dict : ... {
...
#region Python dict implementation
[PythonClassMethod("fromkeys")]
public static object FromKeys(DynamicType cls, object seq) {
return FromKeys(cls, seq, null);
}

[PythonClassMethod("fromkeys")]
public static object FromKeys(DynamicType cls, object seq, object value) {
XRange xr = seq as XRange;
if (xr != null) {
int n = xr.GetLength();
object ret = Ops.Call(cls);
if (ret.GetType() == typeof(Dict)) {
Dict dr = ret as Dict;
for (int i = 0; i < n; i++) {
dr[xr[i]] = value;
}
} else {
// slow path, user defined dict
for (int i = 0; i < n; i++) {
Ops.SetIndex(ret, xr[i], value);
}
}
return ret;
}
return fromkeysAny(cls, seq, value);
}

まず、目に付くのが、次のコメントです。

    #region Python dict implementation

これを見ると、この後に続くメソッド群が、組み込み型 dict に固有の機能を実現したもの implementation だと分かります。
前述したヘルプ情報から、1番目の FromKeys(DynamicType,object) は、第2引数を省略した dict.fromkeys(S) に相当します。また、2番目の FromKeys(DynamicType,object,object) は、第2引数を指定した dict.fromkeys(S,v) に相当します。
これらのメソッドは static 宣言してあり、メソッド呼び出しの対象となるインスタンスが、第1引数 DynamicType cls になります。つまり、static 宣言することで、一連のメソッドを「関数」として再定義するのです。

    public static object FromKeys(DynamicType cls, object seq) {
return FromKeys(cls, seq, null);

1番目の FromKeys() は、2番目の FromKeys() の特殊な(実引数に null を指定した)場合に相当します。そして、この実引数 null は、メソッド呼び出し dict.fromkeys(S,None) に相当します。


1/3