changeset 252:8ebebd557e15

py: initial support for calling Python functions with "py.foo" syntax * @py/py.m: New class. * @py/subsref.m: New method to implement Python name lookup using "py.foo" indexing notation to be compatible with Matlab.
author Mike Miller <mtmiller@octave.org>
date Thu, 28 Jul 2016 12:05:05 -0700
parents c8da556b6793
children ef057c4e6aa2
files @py/py.m @py/subsref.m
diffstat 2 files changed, 86 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/@py/py.m	Thu Jul 28 12:05:05 2016 -0700
@@ -0,0 +1,30 @@
+## Copyright (C) 2016 Mike Miller
+##
+## This file is part of Pytave.
+##
+## Pytave is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or (at
+## your option) any later version.
+##
+## Pytave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Pytave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn  {} {} py
+## @deftypefnx {} {} py.@var{pyname}
+## Get the value of a Python object or call a Python function.
+## @enddeftypefn
+
+function p = py ()
+  p = class (struct (), "py");
+endfunction
+
+%!assert (py.math.sqrt (2), sqrt (2))
+%!assert (ischar (py.sys.version))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/@py/subsref.m	Thu Jul 28 12:05:05 2016 -0700
@@ -0,0 +1,56 @@
+## Copyright (C) 2016 Mike Miller
+##
+## This file is part of Pytave.
+##
+## Pytave is free software; you can redistribute it and/or modify it
+## under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 3 of the License, or (at
+## your option) any later version.
+##
+## Pytave is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with Pytave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {} {} subsref (@var{x}, @var{idx})
+## Implements Python name lookup via dot indexing.
+## @enddeftypefn
+
+function varargout = subsref (x, idx)
+
+  if (nargin != 2)
+    print_usage ();
+  endif
+
+  if (! isa (x, "py"))
+    error ("py: invalid call to subsref");
+  endif
+
+  if (isempty (idx) || ! isstruct (idx))
+    error ("py: invalid call to subsref without indices");
+  endif
+
+  type = idx(1).type;
+  subs = idx(1).subs;
+
+  if (type != ".")
+    error ("py: invalid indexing type");
+  endif
+
+  y = pycall ("__import__", subs);
+
+  if (numel (idx) > 1)
+    y = subsref (y, idx(2:end));
+  endif
+
+  is_none = pyeval ("lambda x: x is None");
+  if (nargout > 0 || ! pycall (is_none, y))
+    varargout{1} = y;
+  endif
+
+endfunction