annotate @pyobject/pyobject.m @ 222:e2e64ee571b7

pyobject: rename whatmethods to methods (fixes #21) Usually `methods` would give the methods of the Octave class. Here we use it to get the properties/callables of a Python object. Add documentation which explains how to get the former behaviour. Add BIST. @pyobject/pyobject.m: remove original function @pyobject/methods.m: new file
author Colin Macdonald <cbm@m.fsf.org>
date Fri, 17 Jun 2016 16:13:36 -0700
parents a76d75683455
children 06835a3e3384
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
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
34 methods (Static)
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
35 function x = fromPythonVarName (pyvarname)
209
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).
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
40 if (! ischar(pyvarname))
209
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 '))']);
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
53 x = pyobject (id);
209
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
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
59 function x = pyobject (id)
209
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
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
65 function delete (x)
209
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
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
87 delete (x)
209
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)
221
a76d75683455 pyobject: split subsref to its own file, reformat
Colin Macdonald <cbm@m.fsf.org>
parents: 220
diff changeset
92 subsref (x, idx)
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
93
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
94 function r = getid (x)
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
95 r = x.id;
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
96 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
97
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
98 function varargout = disp (x)
216
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
99 s = pyeval (sprintf ('str(__InOct__["%s"])', x.id));
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
100 if (nargout == 0)
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
101 disp (s)
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
102 else
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
103 varargout = {s};
3b2b7db7d709 Improve display
Colin Macdonald <cbm@m.fsf.org>
parents: 213
diff changeset
104 end
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
105 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
106
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
107 function s = whatclass (x)
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
108 s = pyeval (sprintf ('str(__InOct__["%s"].__class__)', x.id));
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
109 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
110
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
111 function vargout = help (x)
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
112 idx = struct ('type', '.', 'subs', '__doc__');
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
113 s = subsref (x, idx);
213
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
114 if (nargout == 0)
218
02da92723889 Change style, close to Octave conventions
Colin Macdonald <cbm@m.fsf.org>
parents: 217
diff changeset
115 disp (s)
213
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
116 else
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
117 vargout = {s};
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
118 end
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
119 end
a54ab59c491d merge genuinelucifer/cbm_pytave to macdonald/cbm_pytave
Colin Macdonald <cbm@m.fsf.org>
parents: 209
diff changeset
120
209
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
121 end
57807b5fa7bf Change name of pyobj to pyobject
genuinelucifer
parents:
diff changeset
122 end