Mercurial > pytave
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