Mercurial > pytave
changeset 291:a0dc81daf553
Merged in genuinelucifer/pytave_main (pull request #31)
Edit test and functions to adapt to lists, dicts being pyobjects
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Wed, 03 Aug 2016 15:41:39 -0700 |
parents | ccd9fcaae5f8 (current diff) f2b4576879a6 (diff) |
children | 510ed59a61d3 |
files | |
diffstat | 3 files changed, 34 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/@pyobject/fieldnames.m Tue Aug 02 12:28:07 2016 -0700 +++ b/@pyobject/fieldnames.m Wed Aug 03 15:41:39 2016 -0700 @@ -52,8 +52,10 @@ " and not isinstance(getattr(x, a), __import__('types').ModuleType)" ... " and not a.startswith('_')]"]); - # FIXME: may need to convert from Python list to Octave cell array - names = pycall (cmd, x); + names_obj = pycall (cmd, x); + len = length (names_obj); + idx = struct ("type", "{}", "subs", {{1:len}}); + [names{1:len}] = subsref (names_obj, idx); names = names(:); endfunction
--- a/@pyobject/methods.m Tue Aug 02 12:28:07 2016 -0700 +++ b/@pyobject/methods.m Wed Aug 03 15:41:39 2016 -0700 @@ -71,8 +71,10 @@ cmd = pyeval (["lambda x: [a for a in dir(x)" ... " if callable(getattr(x, a)) and not a.startswith('_')]"]); - # FIXME: may need to convert from Python list to Octave cell array - mtds_list = pycall (cmd, x) + mtds_list_obj = pycall (cmd, x); + len = length (mtds_list_obj); + idx = struct ("type", "{}", "subs", {{1:len}}); + [mtds_list{1:len}] = subsref (mtds_list_obj, idx); if (nargout == 0) ## FIXME: should this be available as @pyobject/ismodule.m ?
--- a/@pyobject/subsref.m Tue Aug 02 12:28:07 2016 -0700 +++ b/@pyobject/subsref.m Wed Aug 03 15:41:39 2016 -0700 @@ -57,7 +57,14 @@ endif endfor - if (isscalar (t.subs)) + if (ischar (t.subs{1}) && strcmp (t.subs{1}, ":")) + is_map = pyeval ("lambda x: isinstance(x, collections.Mapping)"); + if (pycall (is_map, x)) + ind = ":"; + else + ind = int32 ([1:length(x)] - 1); + endif + elseif (isscalar (t.subs)) ind = t.subs{1}; else ## XXX: after #26, #27, I think its just: @@ -70,8 +77,16 @@ pyexec ("_temp = tuple(_temp[0])"); ind = pyobject.fromPythonVarName ("_temp"); endif + gi = pycall ("getattr", x, "__getitem__"); # x.__getitem__ - r = pycall (gi, ind); + if (isnumeric (ind) && length (ind) > 1) + r = {}; + for k = 1:length (ind) + r(end+1) = pycall (gi, ind(k)); + endfor + else + r = pycall (gi, ind); + endif otherwise t @@ -92,7 +107,7 @@ elseif (nargout >= 2) assert (length (r) == nargout, ... "pyobject/subsref: number of outputs must match") - [varargout{1:nargout}] = r{1:nargout}; + [varargout{1:nargout}] = subsref (r, struct ("type", "{}", "subs", {{1:nargout}})); endif endfunction @@ -104,11 +119,11 @@ %! assert (L{1}, 10) %! assert (L{2}, 20) -%!xtest +%!test %! % list indexing, slice %! pyexec ("L = [10, 20, [30, 40]]") %! L = pyobject.fromPythonVarName ("L"); -%! L2 = L{:}; +%! [L2{1:length(L)}] = L{:}; %! assert (L2{1}, 10) %! assert (L2{2}, 20) %! assert (L2{3}{1}, 30) @@ -227,6 +242,12 @@ %! f (); %! assert (length (ans) == 3) +%!test +%! % ensure None is returned if nargout > 0 +%! L = pyeval ("[1, None, 3]"); +%! a = L{2}; +%! assert (char (a), "None") + %!error <outputs must match> %! % multiple return values: too many outputs %! f = pyeval ("lambda: (1, 2)");