Mercurial > pytave
annotate @pyobject/subsref.m @ 227:c56b85f405ba
maint: apply Octave whitespace rules
* @pyobject/display.m, @pyobject/dummy.m, @pyobject/methods.m,
@pyobject/pyobject.m, @pyobject/subsref.m, octave_to_python.cc: Use Octave
whitespace conventions around operators and function argument lists.
* pyeval.cc: Break up long line for readability.
author | Mike Miller <mtmiller@octave.org> |
---|---|
date | Wed, 20 Jul 2016 11:57:14 -0700 |
parents | a76d75683455 |
children | c64435b14a6e 708715efa18e |
rev | line source |
---|---|
221
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
1 ## Copyright (C) 2016 Colin B. Macdonald |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
2 ## |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
3 ## This file is part of PyTave. |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
4 ## |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
5 ## OctSymPy is free software; you can redistribute it and/or modify |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
6 ## it under the terms of the GNU General Public License as published |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
7 ## by the Free Software Foundation; either version 3 of the License, |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
8 ## or (at your option) any later version. |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
9 ## |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
10 ## This software is distributed in the hope that it will be useful, |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
11 ## but WITHOUT ANY WARRANTY; without even the implied warranty |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
12 ## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
13 ## the GNU General Public License for more details. |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
14 ## |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
15 ## You should have received a copy of the GNU General Public |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
16 ## License along with this software; see the file COPYING. |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
17 ## If not, see <http://www.gnu.org/licenses/>. |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
18 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
19 ## -*- texinfo -*- |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
20 ## @documentencoding UTF-8 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
21 ## @defop Method @@pyobject subsref (@var{x}, @var{idx}) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
22 ## @defopx Operator @@pyobject {@var{x}.@var{property}} {} |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
23 ## @defopx Operator @@pyobject {@var{x}.@var{method}(@var{a}, @dots)} {} |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
24 ## @defopx Operator @@pyobject {@var{x}@{@var{i}@}} {} |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
25 ## @defopx Operator @@pyobject {@var{x}@{@var{i}, @var{j}, @dots@}} {} |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
26 ## @defopx Operator @@pyobject {@var{x}(@var{a})} {} |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
27 ## @defopx Operator @@pyobject {@var{x}(@var{a}, @var{b}, @dots)} {} |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
28 ## Call methods and access properties of a Python object. |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
29 ## |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
30 ## |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
31 ## @seealso{@@pyobject/subsasgn} |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
32 ## @end defop |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
33 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
34 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
35 function r = subsref (x, idx) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
36 s = ""; |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
37 for i = 1:length (idx) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
38 t = idx(i); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
39 switch t.type |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
40 case "()" |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
41 if (! isempty (t.subs)) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
42 t |
227
c56b85f405ba
maint: apply Octave whitespace rules
Mike Miller <mtmiller@octave.org>
parents:
221
diff
changeset
|
43 error ("not implemented: function calls with arguments") |
221
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
44 endif |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
45 s = sprintf ("%s()", s); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
46 case "." |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
47 assert (ischar (t.subs)) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
48 s = sprintf ("%s.%s", s, t.subs); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
49 case "{}" |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
50 subsstrs = {}; |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
51 for j = 1:length (t.subs) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
52 thissub = t.subs{j}; |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
53 if (ischar (thissub) && strcmp (thissub, ":")) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
54 subsstrs{j} = ":"; |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
55 elseif (ischar (thissub)) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
56 subsstrs{j} = ["'" thissub "'"]; |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
57 elseif (isnumeric (thissub) && isscalar (thissub)) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
58 % note: python indexed from 0 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
59 subsstrs{j} = num2str (thissub - 1); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
60 else |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
61 thissub |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
62 error ("@pyobject/subsref: subs not supported") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
63 endif |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
64 endfor |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
65 s = [s "[" strjoin(subsstrs, ", ") "]"]; |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
66 otherwise |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
67 t |
227
c56b85f405ba
maint: apply Octave whitespace rules
Mike Miller <mtmiller@octave.org>
parents:
221
diff
changeset
|
68 error ("@pyobject/subsref: not implemented") |
221
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
69 endswitch |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
70 endfor |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
71 r = pyeval (sprintf ("__InOct__['%s']%s", x.id, s)); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
72 endfunction |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
73 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
74 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
75 %!test |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
76 %! % list indexing |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
77 %! pyexec ("L = [10, 20]") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
78 %! L = pyobject.fromPythonVarName ("L"); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
79 %! assert (L{1}, 10) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
80 %! assert (L{2}, 20) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
81 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
82 %!test |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
83 %! % list indexing |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
84 %! pyexec ("L = [10, 20, [30, 40]]") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
85 %! L = pyobject.fromPythonVarName ("L"); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
86 %! L2 = L{:}; |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
87 %! assert (L2{1}, 10) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
88 %! assert (L2{2}, 20) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
89 %! assert (L2{3}{1}, 30) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
90 %! assert (L2{3}{2}, 40) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
91 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
92 %!test |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
93 %! % list indexing, nested list |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
94 %! pyexec ("L = [1, 2, [10, 11, 12]]") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
95 %! L = pyobject.fromPythonVarName ("L"); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
96 %! assert (L{2}, 2) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
97 %! assert (L{3}{1}, 10) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
98 %! assert (L{3}{3}, 12) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
99 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
100 %!test |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
101 %! % 2D array indexing |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
102 %! pyexec ("import numpy") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
103 %! pyexec ("A = numpy.array([[1, 2], [3, 4]])") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
104 %! A = pyobject.fromPythonVarName ("A"); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
105 %! assert (A{1, 1}, 1) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
106 %! assert (A{2, 1}, 3) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
107 %! assert (A{1, 2}, 2) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
108 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
109 %!test |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
110 %! % dict: str key access |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
111 %! pyexec ("d = {'one':1, 5:5, 6:6}") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
112 %! d = pyobject.fromPythonVarName ("d"); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
113 %! assert (d{"one"}, 1) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
114 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
115 %!test |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
116 %! % dict: integer key access |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
117 %! pyexec ("d = {5:42, 6:42}") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
118 %! d = pyobject.fromPythonVarName ("d"); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
119 %! assert (d{6}, 42) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
120 |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
121 %!xtest |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
122 %! % dict: integer key should not subtract one (FIXME: Issue #10) |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
123 %! pyexec ("d = {5:40, 6:42}") |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
124 %! d = pyobject.fromPythonVarName ("d"); |
a76d75683455
pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents:
diff
changeset
|
125 %! assert (d{6}, 42) |