annotate @pyobject/pyobject.m @ 217:69abda471c67

Attempt at moving pyobject from octave to python * @pyobject/pyobject.m: keep ref to __InOct__ in __main__ * pyeval: keep ref to __InOct__ in __main__ * @pyobject/dummy.m: add pycall doctest * octave_to_python.cc: if we see pyobject, get original from __InOct__
author Colin Macdonald <cbm@m.fsf.org>
date Sat, 28 May 2016 10:18:39 -0700
parents 3b2b7db7d709
children 02da92723889
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
1 %% Copyright (C) 2016 Colin B. Macdonald
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
2 %%
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
3 %% This file is part of PyTave.
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
4 %%
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
5 %% OctSymPy is free software; you can redistribute it and/or modify
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
6 %% it under the terms of the GNU General Public License as published
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
7 %% by the Free Software Foundation; either version 3 of the License,
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
8 %% or (at your option) any later version.
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
9 %%
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
10 %% This software is distributed in the hope that it will be useful,
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
11 %% but WITHOUT ANY WARRANTY; without even the implied warranty
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
12 %% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
13 %% the GNU General Public License for more details.
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
14 %%
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
15 %% You should have received a copy of the GNU General Public
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
16 %% License along with this software; see the file COPYING.
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
17 %% If not, see <http://www.gnu.org/licenses/>.
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
18
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
19 %% -*- texinfo -*-
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
20 %% @documentencoding UTF-8
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
21 %% @defun pyobject (@var{s})
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
22 %% Wrap a Python object.
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
23 %%
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
24 %% TODO: where/how to document classdef classes?
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
25 %%
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
26 %% @seealso{pyexec, pyeval}
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
27 %% @end defun
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
28
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
29 classdef pyobject < handle
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
30 properties
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
31 id
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
32 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
33
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
34 methods(Static)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
35 function x = fromPythonVarName(pyvarname)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
36 % if @var{pyvarname} is a string, its assumed to be a variable
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
37 % name, e.g., previously created with pyexec. This must exist
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
38 % at the time of construction but it can disappear later (we
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
39 % will keep track of the reference).
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
40 if (~ ischar(pyvarname))
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
41 error('pyobject: currently we only take variable names as input')
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
42 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
43 cmd = sprintf ([ ...
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
44 'if not ("__InOct__" in vars() or "__InOct__" in globals()):\n' ...
217
69abda471c67 Attempt at moving pyobject from octave to python
Colin Macdonald <cbm@m.fsf.org>
parents: 216
diff changeset
45 ' __InOct__ = dict()\n' ...
69abda471c67 Attempt at moving pyobject from octave to python
Colin Macdonald <cbm@m.fsf.org>
parents: 216
diff changeset
46 ' # FIXME: make it accessible elsewhere?\n' ...
69abda471c67 Attempt at moving pyobject from octave to python
Colin Macdonald <cbm@m.fsf.org>
parents: 216
diff changeset
47 ' import __main__\n' ...
69abda471c67 Attempt at moving pyobject from octave to python
Colin Macdonald <cbm@m.fsf.org>
parents: 216
diff changeset
48 ' __main__.__InOct__ = __InOct__\n' ...
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
49 '__InOct__[hex(id(%s))] = %s' ], ...
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
50 pyvarname, pyvarname);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
51 pyexec (cmd);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
52 id = pyeval (['hex(id(' pyvarname '))']);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
53 x = pyobject(id);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
54 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
55 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
56
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
57
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
58 methods
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
59 function x = pyobject(id)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
60 % warning: not intended for casual use: you must also insert
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
61 % the object into the Python `__InOct__` dict with key `id`.
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
62 x.id = id;
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
63 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
64
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
65 function delete(x)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
66 % called on clear of the last reference---for subclasses of
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
67 % handle; not called at all for "value classes".
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
68 % FIXME: #46497 this is never called!
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
69 %save('proof_of_delete', 6, x.id)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
70 disp ('delete')
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
71 % throws KeyError if it wasn't in there for some reason
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
72 cmd = sprintf ('__InOct__.pop("%s")', x.id);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
73 pyexec (cmd);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
74 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
75
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
76 function force_delete (x)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
77 % Manual workaround for #46497: call right before @code{clear x}. But
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
78 % be careful, @code{x} needs to be the last reference: don't do this:
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
79 % @example
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
80 % d = pyobject (...);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
81 % d2 = d;
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
82 % force_delete (d)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
83 % clear d
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
84 % d2
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
85 % @print{} ... KeyError ...
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
86 % @end example
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
87 delete(x)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
88 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
89
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
90 dummy (x)
216
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
91 display (x)
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
92
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
93 function r = getid (x)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
94 r = x.id;
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
95 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
96
216
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
97 function varargout = disp(x)
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
98 s = pyeval (sprintf ('str(__InOct__["%s"])', x.id));
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
99 if (nargout == 0)
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
100 disp (s)
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
101 else
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
102 varargout = {s};
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
103 end
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
104 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
105
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
106 function s = whatclass(x)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
107 s = pyeval (sprintf ('str(__InOct__["%s"].__class__)', x.id));
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
108 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
109
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
110 function lst = whatmethods(x)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
111 % filter the output of `dir(x)`
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
112 % properties only:
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
113 % [a for a in dir(x) if not callable(getattr(x, a)) and not a.startswith("__")]
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
114 cmd = sprintf ( ...
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
115 '[a for a in dir(__InOct__["%s"]) if not a.startswith("__")]', ...
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
116 x.id);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
117 lst = pyeval (cmd);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
118 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
119
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
120 function r = subsref(x, idx)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
121 s = '';
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
122 for i=1:length(idx)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
123 t = idx(i);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
124 switch t.type
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
125 case '()'
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
126 if ( ! isempty (t.subs))
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
127 t
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
128 error('not implemented: function calls with arguments')
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
129 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
130 s = sprintf ('%s()', s);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
131 case '.'
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
132 assert(ischar(t.subs))
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
133 s = sprintf ('%s.%s', s, t.subs);
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
134 otherwise
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
135 t
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
136 error('not implemented')
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
137 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
138 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
139 r = pyeval (sprintf ('__InOct__["%s"]%s', x.id, s));
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
140 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
141
213
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
142 function vargout = help(x)
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
143 idx = struct('type', '.', 'subs', '__doc__');
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
144 s = subsref(x, idx);
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
145 if (nargout == 0)
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
146 disp(s)
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
147 else
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
148 vargout = {s};
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
149 end
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
150 end
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
151
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
152 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
153 end