// Constructor call public override IMember CreateInstance(IArgumentSet args) { var builtins = DeclaringModule.Interpreter.ModuleResolution.BuiltinsModule; // Specializations switch (Name) { case "list": return(PythonCollectionType.CreateList(builtins, args)); case "dict": { // self, then contents var contents = args.Values <IMember>().Skip(1).FirstOrDefault(); return(new PythonDictionary(builtins, contents)); } case "tuple": { var contents = args.Values <IMember>(); return(PythonCollectionType.CreateTuple(builtins, contents)); } } // Metaclasses return type, not instance. if (Bases.MaybeEnumerate().Any(b => b.Name == "type" && b.DeclaringModule.ModuleType == ModuleType.Builtins)) { return(this); } return(new PythonInstance(this)); }
public override IMember Index(IPythonInstance instance, IArgumentSet args) { var defaultReturn = base.Index(instance, args); var fromBases = Bases .MaybeEnumerate() .Select(b => b.Index(instance, args)) .Except(new[] { defaultReturn, UnknownType }) .FirstOrDefault(); return(fromBases ?? defaultReturn); }