Mercurial > pytave
diff @pyobject/methods.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 | |
children | c56b85f405ba |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/@pyobject/methods.m Fri Jun 17 16:13:36 2016 -0700 @@ -0,0 +1,83 @@ +## Copyright (C) 2016 Colin B. Macdonald +## +## This file is part of PyTave. +## +## OctSymPy 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 methods (@var{x}) +## List the properties/callables of a Python object. +## +## Returns a cell array of strings, the names of the properties +## and ``callables'' of @var{x}. +## +## Example: +## @example +## @group +## pyexec ("import sys") +## sys = pyeval ("sys"); +## methods (sys) +## @result{} ans = +## @{ +## [1,1] = ... +## [1,2] = ... +## ... = path +## ... = version +## ... +## @} +## @end group +## @end example +## +## Note that if you instead want the methods implemented by +## the Octave class @code{@@pyobject}, use can always do: +## @example +## @group +## methods pyobject +## @print{} Methods for class pyobject: +## @print{} display ... subsref +## @comment this doctest may need updating as we add methods +## @end group +## @end example +## +## @seealso{methods} +## @end defmethod + + +function L = methods (x) + # filter the output of `dir(x)` + # (to get properties only: + # [a for a in dir(x) if not callable(getattr(x, a)) and not a.startswith('__')] + cmd = sprintf ( ... + "[a for a in dir(__InOct__['%s']) if not a.startswith('__')]", ... + getid(x)); + # TODO: may need to convert from Python list to Octave list + L = pyeval (cmd); +endfunction + + +%!test +%! pyexec ("import sys") +%! sys = pyeval ("sys"); +%! L = methods (sys); +%! % sys has lots of methods +%! assert (length (L) >= 32) +%! % version is one of them +%! assert (any (strcmp (L, "version"))) + +%!test +%! pyexec ("import sys") +%! L = methods (pyeval ("sys")); +%! assert (iscell (L))