示例#1
0
        public IEnumerator <T> GetEnumerator()
        {
            PyObject iterObject;

            using (Py.GIL())
            {
                var iter = Runtime.PyObject_GetIter(pyObject.Reference);
                PythonException.ThrowIfIsNull(iter);
                iterObject = iter.MoveToPyObject();
            }

            while (true)
            {
                using (Py.GIL())
                {
                    var item = Runtime.PyIter_Next(iterObject.Handle);
                    if (item == IntPtr.Zero)
                    {
                        Runtime.CheckExceptionOccurred();
                        iterObject.Dispose();
                        break;
                    }

                    yield return((T) new PyObject(item).AsManagedObject(typeof(T)));
                }
            }
        }
示例#2
0
            public override ValueType Execute(ValueType arg)
            {
                var module = (IntPtr)arg;
                using (Py.GIL())
                {
                    var test_obj_call = PyRuntime.PyObject_GetAttrString(module, "test_obj_call");
                    PythonException.ThrowIfIsNull(test_obj_call);
                    var args = PyRuntime.PyTuple_New(0);
                    var res = PyRuntime.PyObject_CallObject(test_obj_call, args);
                    PythonException.ThrowIfIsNull(res);

                    PyRuntime.XDecref(args);
                    PyRuntime.XDecref(res);
                }
                return 0;
            }
示例#3
0
        public PyObject?TryEncode(object value)
        {
            if (value == null)
            {
                return(null);
            }

            var tupleType = value.GetType();

            if (tupleType == typeof(object))
            {
                return(null);
            }
            if (!this.CanEncode(tupleType))
            {
                return(null);
            }
            if (tupleType == typeof(TTuple))
            {
                return(new PyTuple());
            }

            nint fieldCount = tupleType.GetGenericArguments().Length;

            using var tuple = Runtime.PyTuple_New(fieldCount);
            PythonException.ThrowIfIsNull(tuple);
            int fieldIndex = 0;

            foreach (FieldInfo field in tupleType.GetFields())
            {
                var item = field.GetValue(value);
                using var pyItem = Converter.ToPython(item, field.FieldType);
                Runtime.PyTuple_SetItem(tuple.Borrow(), fieldIndex, pyItem.Steal());
                fieldIndex++;
            }
            return(new PyTuple(tuple.Steal()));
        }