Revision: 464
http://rpy.svn.sourceforge.net/rpy/?rev=464&view=rev
Author: lgautier
Date: 2008-03-24 02:04:24 -0700 (Mon, 24 Mar 2008)
Log Message:
-----------
- implemented __iter__ for SexpEnvironment
- added PROTECT/UNPROTECT for __len__
Modified Paths:
--------------
branches/rpy_nextgen/rpy/rinterface/rinterface.c
branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py
Modified: branches/rpy_nextgen/rpy/rinterface/rinterface.c
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-03-23 22:08:42 UTC
(rev 463)
+++ branches/rpy_nextgen/rpy/rinterface/rinterface.c 2008-03-24 09:04:24 UTC
(rev 464)
@@ -1017,8 +1017,10 @@
PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP.");
return -1;
}
- SEXP symbols = R_lsInternal(rho_R, TRUE);
+ SEXP symbols;
+ PROTECT(symbols = R_lsInternal(rho_R, TRUE));
Py_ssize_t len = (Py_ssize_t)GET_LENGTH(symbols);
+ UNPROTECT(1);
return len;
}
@@ -1028,6 +1030,26 @@
(objobjargproc)EnvironmentSexp_ass_subscript /* mp_ass_subscript */
};
+static PyObject*
+EnvironmentSexp_iter(PyObject *sexpEnvironment)
+{
+ SEXP rho_R = ((SexpObject *)sexpEnvironment)->sexp;
+
+ if (! rho_R) {
+ PyErr_Format(PyExc_ValueError, "The environment has NULL SEXP.");
+ return NULL;
+ }
+ SEXP symbols;
+ PROTECT(symbols = R_lsInternal(rho_R, TRUE));
+ SexpObject *seq = newSexpObject(symbols);
+ Py_INCREF(seq);
+ UNPROTECT(1);
+
+ PyObject *it = PyObject_GetIter((PyObject *)seq);
+ Py_DECREF(seq);
+ return it;
+}
+
PyDoc_STRVAR(EnvironmentSexp_Type_doc,
"R object that is an environment.\
R environments can be seen as similar to Python\
@@ -1073,7 +1095,7 @@
0, /*tp_clear*/
0, /*tp_richcompare*/
0, /*tp_weaklistoffset*/
- 0, /*tp_iter*/
+ EnvironmentSexp_iter, /*tp_iter*/
0, /*tp_iternext*/
EnvironmentSexp_methods, /*tp_methods*/
0, /*tp_members*/
Modified: branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py
===================================================================
--- branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py
2008-03-23 22:08:42 UTC (rev 463)
+++ branches/rpy_nextgen/rpy/rinterface/tests/test_SexpEnvironment.py
2008-03-24 09:04:24 UTC (rev 464)
@@ -54,6 +54,16 @@
env["b"] = rinterface.SexpVector([123, ], rinterface.INTSXP)
self.assertEquals(2, len(env))
+ def testIter(self):
+ newEnv = rinterface.globalEnv.get("new.env")
+ env = newEnv()
+ env["a"] = rinterface.SexpVector([123, ], rinterface.INTSXP)
+ env["b"] = rinterface.SexpVector([456, ], rinterface.INTSXP)
+ symbols = [x for x in env]
+ self.assertEquals(2, len(symbols))
+ for s in ["a", "b"]:
+ self.assertTrue(s in symbols)
+
def suite():
suite =
unittest.TestLoader().loadTestsFromTestCase(SexpEnvironmentTestCase)
return suite
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
rpy-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rpy-list