changeset 275:24faaa3cf5e5

Merged in macdonald/pytave (pull request #23) [wip] partial support for multiple outputs
author Mike Miller <mike@mtmxr.com>
date Fri, 29 Jul 2016 14:39:27 -0700
parents ecca6a885ffd (current diff) decd3bd7da7e (diff)
children e4175c38b012
files @pyobject/subsref.m
diffstat 1 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/@pyobject/subsref.m	Fri Jul 29 13:39:23 2016 -0700
+++ b/@pyobject/subsref.m	Fri Jul 29 14:39:27 2016 -0700
@@ -85,8 +85,14 @@
 
   ## unpack results, ensure "ans" works (see also pycall)
   is_none = pyeval ("lambda x: x is None");
-  if (nargout > 0 || ! pycall (is_none, r))
+  if (nargout == 0 && ! pycall (is_none, r))
+    varargout{1} = r;
+  elseif (nargout == 1)
     varargout{1} = r;
+  elseif (nargout >= 2)
+    assert (length (r) == nargout, ...
+            "pyobject/subsref: number of outputs must match")
+    [varargout{1:nargout}] = r{1:nargout};
   endif
 endfunction
 
@@ -200,3 +206,33 @@
 %! s.pop ();
 %! assert (exist ("ans", "var"))
 %! assert (length (s) == 1)
+
+%!test
+%! % multiple return values: can get all of them
+%! f = pyeval ("lambda: (1, 2, 3)");
+%! a = f ();
+%! assert (length (a) == 3)
+
+%!test
+%! % multiple return values: separate them
+%! f = pyeval ("lambda: (1, 2, 3)");
+%! [a, b, c] = f ();
+%! assert (a, 1)
+%! assert (b, 2)
+%! assert (c, 3)
+
+%!test
+%! % multiple return values: set ans
+%! f = pyeval ("lambda: (1, 2, 3)");
+%! f ();
+%! assert (length (ans) == 3)
+
+%!error <outputs must match>
+%! % multiple return values: too many outputs
+%! f = pyeval ("lambda: (1, 2)");
+%! [a, b, c] = f ();
+
+%!error <outputs must match>
+%! % multiple return values: not enough outputs
+%! f = pyeval ("lambda: (1, 2, 3)");
+%! [a, b] = f ();