Mercurial > pytave
view @pyobject/cell.m @ 321:3afd890fff6d
Rewrite pyobject.cell, always return a cell array of the right size
* @pyobject/cell.m: Rewrite, ensuring return value is always a cell array
of the correct size. Add more %!tests.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Thu, 11 Aug 2016 22:35:19 -0700 |
parents | de98627cf8ae |
children | 15c20ab4b80a |
line wrap: on
line source
## Copyright (C) 2016 Colin B. Macdonald ## 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. ## ## This software 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 this software; see the file COPYING. ## If not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- ## @documentencoding UTF-8 ## @defmethod @@pyobject cell (@var{x}) ## Convert a Python list or other object implementing the Sequence protocol ## to a cell array. ## ## For example, by default Python lists are not automatically ## converted into native Octave objects: ## @example ## @group ## L = pyeval ("[10, 20, 'hello']") ## @result{} L = [pyobject ...] ## ## [10, 20, 'hello'] ## @end group ## @end example ## ## However, we can convert the list to a cell array: ## @example ## @group ## C = cell (L) ## @result{} C = ## @{ ## [1,1] = 10 ## [1,2] = 20 ## [1,3] = hello ## @} ## @end group ## @end example ## ## The conversion is not recursive, in the following sense: ## @example ## @group ## L = pyeval ("[10, 20, [33, 44], 50]"); ## C = cell (L) ## @result{} C = ## @{ ## [1,1] = 10 ## [1,2] = 20 ## = [pyobject ...] ## ## [33, 44] ## ## [1,4] = 50 ## @} ## @end group ## @end example ## ## @seealso{cell2mat} ## @end defmethod function c = cell (x) ## FIXME: when subsref returns the right number of output args, this can ## simply be "c = {x{:}}" n = length (x); c = cell (1, n); if (n > 0) [c{:}] = subsref (x, struct ("type", "{}", "subs", {{":"}})); endif endfunction %!assert (cell (pyeval ("[]")), cell (1, 0)) %!assert (cell (pyeval ("[1]")), {1}) %!assert (cell (pyeval ("[1, 2, 3]")), {1, 2, 3}) %!assert (cell (pyeval ("(1, 2, 3)")), {1, 2, 3}) %!assert (cell (pyobject ("asdf")), {"a", "s", "d", "f"}) %!assert (cell (pyeval ("range(10)")), num2cell (0:9)) %!error cell (pyobject ()) %!error cell (pyeval ("None")) %!error cell (pyobject (1))