|
|
Line 119: |
Line 119: |
| ==== Python Objects in Octave ==== | | ==== Python Objects in Octave ==== |
|
| |
|
| The {{Codeline|@pyobj}} classdef class is intended to wrap arbitrary Python objects so they can be accessed an manipulated from within Octave. | | The {{Codeline|@pyobject}} class wraps arbitrary Python objects so they can be accessed and manipulated from within Octave. In most cases, these are created automatically. |
| | |
| {{Code|avoiding garbage collection|<syntaxhighlight lang="octave" style="font-size:13px" line highlight="4">
| |
| pyexec('d = dict(one=1, two=2)') # create object in Python
| |
| x = pyobj('d') # create pyobj wrapper for that object
| |
| pyexec('d = []') # careful, don't lose the object to the GC
| |
| x.keys() # list the keys of the dict
| |
| clear x # now the object could be GCed
| |
| </syntaxhighlight>}}
| |
| | |
| One proposed way to do this:
| |
| | |
| 1. `x` stores the pointer to `d`. The `@pyobj` ctor creates a dummy reference to `d`, this prevents GC
| |
| | |
| 2. on deletion of x (`clear x`) we delete the dummy reference in Python.
| |
| | |
| Notes:
| |
| | |
| * Seems like the relevant "pointer" is {{Codeline|id()}}. Haven't seen yet how to access an object from its id, except that its a bad idea...
| |
| | |
| * My plan to create a dict in Python, indexed by {{Codeline|hex(id(x))}}, maybe called {{Codeline|__InOct__}}. Then pass the id of the object to the {{Codeline|@pyobj/pyobj}} constructor.
| |
| | |
| * Follow along and help out here: https://bitbucket.org/macdonald/pytave/commits/branch/cbm_pyobj
| |
| | |
| * Rejected idea: store the `repr` as a string in `x`. But this makes a copy of the object rather than a reference to the original object.
| |
| | |
| ====== Interface design ======
| |
| | |
| * {{Codeline|pyeval}} should be modified to return a {{Codeline|@pyobj}} for things that it cannot convert to Octave-native types. See the `networkx` example above: `G` could be returned by `pyeval`.
| |
| | |
| * {{Codeline|@pyobj/pyobj}} constructor would not normally be called by users.
| |
|
| |
|
| == Known Problems == | | == Known Problems == |