public PythonTuple __reduce__() { return(PythonTuple.MakeTuple( DynamicHelpers.GetPythonTypeFromType(typeof(Zip)), PythonTuple.Make(enumerators) )); }
/// <summary> /// clr.CompileSubclassTypes(assemblyName, *typeDescription) /// /// Provides a helper for creating an assembly which contains pre-generated .NET /// base types for new-style types. /// /// This assembly can then be AddReferenced or put sys.prefix\DLLs and the cached /// types will be used instead of generating the types at runtime. /// /// This function takes the name of the assembly to save to and then an arbitrary /// number of parameters describing the types to be created. Each of those /// parameter can either be a plain type or a sequence of base types. /// /// clr.CompileSubclassTypes(object) -> create a base type for object /// clr.CompileSubclassTypes(object, str, System.Collections.ArrayList) -> create /// base types for both object and ArrayList. /// /// clr.CompileSubclassTypes(object, (object, IComparable)) -> create base types for /// object and an object which implements IComparable. /// /// </summary> public static void CompileSubclassTypes(string /*!*/ assemblyName, params object[] newTypes) { if (assemblyName == null) { throw PythonOps.TypeError("CompileTypes expected str for assemblyName, got NoneType"); } var typesToCreate = new List <PythonTuple>(); foreach (object o in newTypes) { if (o is PythonType) { typesToCreate.Add(PythonTuple.MakeTuple(o)); } else { typesToCreate.Add(PythonTuple.Make(o)); } } NewTypeMaker.SaveNewTypes(assemblyName, typesToCreate); }
public MemoryView cast([NotNull] string format, [NotNull, AllowNull] object shape) { if (!_isCContig) { throw PythonOps.TypeError("memoryview: casts are restricted to C-contiguous views"); } if (_shape.Contains(0) || _strides.Contains(0)) { throw PythonOps.TypeError("memoryview: cannot cast view with zeros in shape or strides"); } PythonTuple?shapeAsTuple = null; if (shape != null) { if (!(shape is PythonList) && !(shape is PythonTuple)) { throw PythonOps.TypeError("shape must be a list or a tuple"); } shapeAsTuple = PythonTuple.Make(shape); int newNDim = shapeAsTuple.Count; if (newNDim > MaximumDimensions) { throw PythonOps.TypeError("memoryview: number of dimensions must not exceed {0}", MaximumDimensions); } if (_numDims != 1 && newNDim != 1) { throw PythonOps.TypeError("memoryview: cast must be 1D -> ND or ND -> 1D"); } } if (!TypecodeOps.TryDecomposeTypecode(format, out char byteorder, out char typecode) || !IsSupportedTypecode(typecode) || byteorder != '@' ) { throw PythonOps.ValueError( "memoryview: destination format must be a native single character format prefixed with an optional '@'"); } if (!TypecodeOps.IsByteCode(typecode)) { TypecodeOps.DecomposeTypecode(_format, out _, out char thisTypecode); if (!TypecodeOps.IsByteCode(thisTypecode)) { throw PythonOps.TypeError("memoryview: cannot cast between two non-byte formats"); } } int newItemsize = TypecodeOps.GetTypecodeWidth(typecode); if ((_numItems * _itemSize) % newItemsize != 0) { throw PythonOps.TypeError("memoryview: length is not a multiple of itemsize"); } int newLength = _numItems * _itemSize / newItemsize; int[] newShape; if (shapeAsTuple != null) { newShape = new int[shapeAsTuple.Count]; int lengthGivenShape = 1; for (int i = 0; i < shapeAsTuple.Count; i++) { newShape[i] = Converter.ConvertToInt32(shapeAsTuple[i]); lengthGivenShape *= newShape[i]; } if (lengthGivenShape != newLength) { throw PythonOps.TypeError("memoryview: product(shape) * itemsize != buffer size"); } } else { newShape = new int[] { newLength }; } return(new MemoryView(this, format, newItemsize, newShape)); }
public MemoryView cast(object format, [NotNull] object shape) { if (!(format is string formatAsString)) { throw PythonOps.TypeError("memoryview: format argument must be a string"); } if (_step != 1) { throw PythonOps.TypeError("memoryview: casts are restricted to C-contiguous views"); } if ((shape != null || ndim != 0) && this.shape.Contains(0)) { throw PythonOps.TypeError("memoryview: cannot cast view with zeros in shape or strides"); } PythonTuple shapeAsTuple = null; if (shape != null) { if (!(shape is PythonList) && !(shape is PythonTuple)) { throw PythonOps.TypeError("shape must be a list or a tuple"); } shapeAsTuple = PythonTuple.Make(shape); int newNDim = shapeAsTuple.Count; if (newNDim > MaximumDimensions) { throw PythonOps.TypeError("memoryview: number of dimensions must not exceed {0}", MaximumDimensions); } if (ndim != 1 && newNDim != 1) { throw PythonOps.TypeError("memoryview: cast must be 1D -> ND or ND -> 1D"); } } int newItemsize; if (!TypecodeOps.TryGetTypecodeWidth(formatAsString, out newItemsize)) { throw PythonOps.ValueError( "memoryview: destination format must be a native single character format prefixed with an optional '@'"); } bool thisIsBytes = this.format == "B" || this.format == "b" || this.format == "c"; bool otherIsBytes = formatAsString == "B" || formatAsString == "b" || formatAsString == "c"; if (!thisIsBytes && !otherIsBytes) { throw PythonOps.TypeError("memoryview: cannot cast between two non-byte formats"); } int length = numberOfElements(); if (length % newItemsize != 0) { throw PythonOps.TypeError("memoryview: length is not a multiple of itemsize"); } int newLength = length * _itemsize / newItemsize; if (shapeAsTuple != null) { int lengthGivenShape = 1; for (int i = 0; i < shapeAsTuple.Count; i++) { lengthGivenShape *= Converter.ConvertToInt32(shapeAsTuple[i]); } if (lengthGivenShape != newLength) { throw PythonOps.TypeError("memoryview: product(shape) * itemsize != buffer size"); } } return(new MemoryView(_buffer, _start, _end, _step, formatAsString, shapeAsTuple ?? PythonTuple.MakeTuple(newLength), _isReadOnly)); }