Mercurial > pytave
diff __py_struct_from_dict__.cc @ 358:d41fc23d4b9f
pyobject.isa: New overload method to handle Python types (fixes issue #49)
* __py_struct_from_dict__.cc (F__py_isinstance__): New function to check
whether a pyobject is an instance of a named type.
* @pyobject/pyobject.m (pyobject.isa): New method. Add %!tests.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Tue, 23 Aug 2016 18:09:17 -0700 |
parents | 6cd581661176 |
children | b0677c492655 |
line wrap: on
line diff
--- a/__py_struct_from_dict__.cc Tue Aug 23 17:37:08 2016 -0700 +++ b/__py_struct_from_dict__.cc Tue Aug 23 18:09:17 2016 -0700 @@ -31,6 +31,7 @@ #include "arrayobjectdefs.h" #include "exceptions.h" #include "oct-py-types.h" +#include "oct-py-util.h" #include "octave_to_python.h" DEFUN_DLD (__py_int64_scalar_value__, args, nargout, @@ -77,6 +78,62 @@ return retval; } +DEFUN_DLD (__py_isinstance__, args, nargout, + "-*- texinfo -*-\n\ +@deftypefn {} {} __py_isinstance__ (@var{x})\n\ +Check whether the Python object @var{obj} is an instance of a Python type\n\ +specified by the string @var{type}.\n\ +\n\ +This is a private internal function not intended for direct use.\n\ +@end deftypefn") +{ + octave_value_list retval; + + int nargin = args.length (); + if (nargin != 2) + { + print_usage (); + return retval; + } + + if (! (args(0).is_object () && args(0).class_name () == "pyobject")) + error ("pyobject.isa: OBJ must be a Python object"); + + if (! args(1).is_string ()) + error ("pyobject.isa: TYPE must be a string naming a Python type (py.*)"); + + std::string typestr = args(1).string_value (); + if (! ((typestr.size () > 3) && (typestr.compare (0, 3, "py.") == 0))) + error ("pyobject.isa: TYPE must be a string naming a Python type (py.*)"); + + typestr = typestr.substr (3); + + Py_Initialize (); + + try + { + // FIXME: PyObject *obj = look up stored pyobject reference (args(0)); + boost::python::object arg; + pytave::octvalue_to_pyobj (arg, args(0)); + PyObject *obj = arg.ptr (); + + PyObject *type = pytave::py_find_type (typestr); + retval(0) = pytave::py_isinstance (obj, type); + Py_XDECREF (type); + } + catch (pytave::object_convert_exception const &) + { + error ("pyobject.isa: error in return value type conversion"); + } + catch (boost::python::error_already_set const &) + { + std::string message = pytave::fetch_exception_message (); + error ("pyobject.isa: %s", message.c_str ()); + } + + return retval; +} + DEFUN_DLD (__py_struct_from_dict__, args, nargout, "-*- texinfo -*-\n\ @deftypefn {} {} __py_struct_from_dict__ (@var{dict})\n\