Esempio n. 1
0
        /// <summary>
        ///     Call this PyObject as a python function
        /// </summary>
        /// <param name="keywords"></param>
        /// <param name="parms"></param>
        /// <returns></returns>
        public PyObject CallThisWithKeywords(Dictionary <string, object> keywords, params object[] parms)
        {
            if (!IsValid)
            {
                return(PySharp.PyZero);
            }

            if (_pySharp == null)
            {
                throw new NotImplementedException();
            }

            var pyKeywords = PySharp.PyZero;

            if (keywords != null && keywords.Keys.Any())
            {
                pyKeywords = new PyObject(_pySharp, Py.PyDict_New(), true);
                foreach (var item in keywords)
                {
                    var pyValue = _pySharp.From(item.Value);

                    if (pyValue == null || pyValue.IsNull)
                    {
                        throw new NotImplementedException();
                    }

                    Py.PyDict_SetItem(pyKeywords, _pySharp.From(item.Key), pyValue);
                }
            }

            var pyParms = new List <PyObject>();

            foreach (var parm in parms)
            {
                var pyParm = _pySharp.From(parm);

                if (pyParm == null || pyParm.IsNull)
                {
                    throw new NotImplementedException();
                }

                // Fail if any parameter is invalid (PyNone is a valid parameter)
                if (pyParm.IsNull)
                {
                    return(PySharp.PyZero);
                }

                pyParms.Add(pyParm);
            }

            var      format = "(" + string.Join("", pyParms.Select(dummy => "O").ToArray()) + ")";
            PyObject pyArgs = null;

            if (pyParms.Count == 0)
            {
                pyArgs = new PyObject(_pySharp, Py.Py_BuildValue(format), true);
            }
            if (pyParms.Count == 1)
            {
                pyArgs = new PyObject(_pySharp, Py.Py_BuildValue(format, pyParms[0]), true);
            }
            if (pyParms.Count == 2)
            {
                pyArgs = new PyObject(_pySharp, Py.Py_BuildValue(format, pyParms[0], pyParms[1]), true);
            }
            if (pyParms.Count == 3)
            {
                pyArgs = new PyObject(_pySharp, Py.Py_BuildValue(format, pyParms[0], pyParms[1], pyParms[2]), true);
            }
            if (pyParms.Count == 4)
            {
                pyArgs = new PyObject(_pySharp, Py.Py_BuildValue(format, pyParms[0], pyParms[1], pyParms[2], pyParms[3]), true);
            }
            if (pyParms.Count == 5)
            {
                pyArgs = new PyObject(_pySharp, Py.Py_BuildValue(format, pyParms[0], pyParms[1], pyParms[2], pyParms[3], pyParms[4]), true);
            }
            if (pyParms.Count == 6)
            {
                pyArgs = new PyObject(_pySharp, Py.Py_BuildValue(format, pyParms[0], pyParms[1], pyParms[2], pyParms[3], pyParms[4], pyParms[5]), true);
            }
            if (pyParms.Count == 7)
            {
                pyArgs = new PyObject(_pySharp, Py.Py_BuildValue(format, pyParms[0], pyParms[1], pyParms[2], pyParms[3], pyParms[4], pyParms[5], pyParms[6]), true);
            }

            if (pyArgs == null)
            {
                throw new NotImplementedException();
            }

            return(new PyObject(_pySharp, Py.PyEval_CallObjectWithKeywords(this, pyArgs, pyKeywords), true));
        }