[pygobject] [gi] Add pythonic iterator and indexing for string GVariants
- From: Martin Pitt <martinpitt src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [pygobject] [gi] Add pythonic iterator and indexing for string GVariants
- Date: Wed, 19 Jan 2011 19:19:05 +0000 (UTC)
commit 2b8e1d0531dcb8f57dc9f2fddf25970bee3daa90
Author: Martin Pitt <martin pitt ubuntu com>
Date: Wed Jan 19 20:18:19 2011 +0100
[gi] Add pythonic iterator and indexing for string GVariants
This extends commit b1a98083c to also work for strings.
gi/overrides/GLib.py | 8 +++++++-
tests/test_overrides.py | 13 +++++++++++++
2 files changed, 20 insertions(+), 1 deletions(-)
---
diff --git a/gi/overrides/GLib.py b/gi/overrides/GLib.py
index 38453de..100574e 100644
--- a/gi/overrides/GLib.py
+++ b/gi/overrides/GLib.py
@@ -199,9 +199,11 @@ class Variant(GLib.Variant):
# Pythonic iterators
#
def __len__(self):
+ if self.get_type_string() in ['s', 'o', 'g']:
+ return len(self.get_string())
if self.get_type_string().startswith('a') or self.get_type_string().startswith('('):
return self.n_children()
- raise TypeError, 'GVariant type %s is not a container' % self.get_type_string()
+ raise TypeError, 'GVariant type %s does not have a length' % self.get_type_string()
def __getitem__(self, key):
# dict
@@ -233,6 +235,10 @@ class Variant(GLib.Variant):
raise IndexError, 'list index out of range'
return self.get_child_value(key).unpack()
+ # string
+ if self.get_type_string() in ['s', 'o', 'g']:
+ return self.get_string().__getitem__(key)
+
raise TypeError, 'GVariant type %s is not a container' % self.get_type_string()
def keys(self):
diff --git a/tests/test_overrides.py b/tests/test_overrides.py
index 67ccf6b..6a8488f 100644
--- a/tests/test_overrides.py
+++ b/tests/test_overrides.py
@@ -132,6 +132,19 @@ class TestGLib(unittest.TestCase):
self.assertEqual(set(vsi.keys()), set(['key1', 'key2']))
self.assertEqual(set(vis.keys()), set([1, 5]))
+ # string index access
+ v = GLib.Variant('si', 'hello')
+ self.assertEqual(len(v), 5)
+ self.assertEqual(v[0], 'h')
+ self.assertEqual(v[4], 'o')
+ self.assertEqual(v[-1], 'o')
+ self.assertEqual(v[-5], 'h')
+ self.assertRaises(IndexError, v.__getitem__, 5)
+ self.assertRaises(IndexError, v.__getitem__, -6)
+
+ # string iteration
+ self.assertEqual([x for x in v], ['h', 'e', 'l', 'l', 'o'])
+
class TestPango(unittest.TestCase):
def test_default_font_description(self):
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]