Mercurial > pytave
view @py/subsref.m @ 368:4d54fb68de71
__py_is_none__: new compiled function to test whether an object is None
* __py_struct_from_dict__.cc (F__py_is_none__): New function.
* @py/subsref.m, @pyobject/subsref.m, pycall.cc: Use __py_is_none__ instead
of ad hoc lambda expression.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Thu, 25 Aug 2016 16:27:46 -0700 |
parents | 9d7188514f2c |
children |
line wrap: on
line source
## 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 if (type == "." && ((numel (idx) == 1) || (idx(2).type != "."))) try y = pyeval (subs); catch y = pycall ("__import__", subs); end_try_catch else y = pycall ("__import__", subs); endif if (numel (idx) > 1) y = subsref (y, idx(2:end)); endif ## If the *last* indexing operation is ".name", and the object returned ## is a Python callable, then call it with no arguments to be compatible ## with how Octave functions are evaluated. if (idx(end).type == ".") if (isa (y, "py.collections.Callable")) y = pycall (y); endif endif if (nargout > 0 || ! __py_is_none__ (y)) varargout{1} = y; endif endfunction