[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20847] branches/blender2.5/blender/source /blender/python/intern/bpy_rna.c: adding __contains__ to python rna props.

Campbell Barton ideasman42 at gmail.com
Sat Jun 13 10:04:44 CEST 2009


Revision: 20847
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20847
Author:   campbellbarton
Date:     2009-06-13 10:04:43 +0200 (Sat, 13 Jun 2009)

Log Message:
-----------
adding __contains__ to python rna props.
example usage.
 if "Scene" in bpy.data.scenes: print(True)
 
Only works for strings with collection property types.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-06-13 06:42:12 UTC (rev 20846)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-06-13 08:04:43 UTC (rev 20847)
@@ -763,6 +763,39 @@
 	( objobjargproc ) pyrna_prop_assign_subscript,	/* mp_ass_subscript */
 };
 
+static int pyrna_prop_contains(BPy_PropertyRNA * self, PyObject *value)
+{
+	PointerRNA newptr; /* not used, just so RNA_property_collection_lookup_string runs */
+	char *keyname = _PyUnicode_AsString(value);
+	
+	if(keyname==NULL) {
+		PyErr_SetString(PyExc_SystemError, "PropertyRNA - key in prop, key must be a string type");
+		return -1;
+	}
+	
+	if (RNA_property_type(self->prop) != PROP_COLLECTION) {
+		PyErr_SetString(PyExc_SystemError, "PropertyRNA - key in prop, is only valid for collection types");
+		return -1;
+	}
+	
+	
+	if (RNA_property_collection_lookup_string(&self->ptr, self->prop, keyname, &newptr))
+		return 1;
+	
+	return 0;
+}
+
+static PySequenceMethods pyrna_prop_as_sequence = {
+	NULL,		/* Cant set the len otherwise it can evaluate as false */
+	NULL,		/* sq_concat */
+	NULL,		/* sq_repeat */
+	NULL,		/* sq_item */
+	NULL,		/* sq_slice */
+	NULL,		/* sq_ass_item */
+	NULL,		/* sq_ass_slice */
+	(objobjproc)pyrna_prop_contains,	/* sq_contains */
+};
+
 static PyObject *pyrna_struct_dir(BPy_StructRNA * self)
 {
 	PyObject *ret, *dict;
@@ -1403,7 +1436,7 @@
 	/* Method suites for standard classes */
 
 	NULL,                       /* PyNumberMethods *tp_as_number; */
-	NULL,						/* PySequenceMethods *tp_as_sequence; */
+	&pyrna_prop_as_sequence,	/* PySequenceMethods *tp_as_sequence; */
 	&pyrna_prop_as_mapping,		/* PyMappingMethods *tp_as_mapping; */
 
 	/* More standard operations (here for binary compatibility) */





More information about the Bf-blender-cvs mailing list