]> git.llucax.com Git - software/pymin.git/blob - pymin/seqtools.py
Add support to "operation tagging" to ListSubHandler and DictSubHandler.
[software/pymin.git] / pymin / seqtools.py
1 # vim: set encoding=utf-8 et sw=4 sts=4 :
2
3 r"""
4 Sequence utilities.
5
6 This module provides some tools to ease working with sequences.
7 """
8
9 class Sequence:
10     r"""Sequence() -> Sequence instance.
11
12     This is an abstract class to ease the implementation of sequences. You can
13     inherit your objects from this class and implement just a method called
14     as_tuple() which returns a tuple representation of the object.
15
16     Example:
17
18     >>> class A(Sequence):
19     >>>     def __init__(self):
20     >>>         self.a = 1
21     >>>         self.b = 2
22     >>>     def as_tuple(self):
23     >>>         return (self.a, self.b)
24     >>> for i in A():
25     >>>     print i
26     >>> print A()[1]
27     """
28
29     def __iter__(self):
30         r"iter(obj) -> iterator object :: Get iterator."
31         for i in self.as_tuple():
32             yield i
33
34     def __len__(self):
35         r"len(obj) -> int :: Get object length."
36         return len(self.as_tuple())
37
38     def __getitem__(self, i):
39         r"obj[i] -> object :: Get item with the index i."
40         return self.as_tuple()[i]
41
42     def __unicode__(self):
43         return u'%s%r' % (self.__class__.__name__, self.as_tuple())
44
45     def __str__(self):
46         return unicode(self).encode('utf-8')
47
48     def __repr__(self):
49         return str(self)
50
51 def as_tuple(obj):
52     r"""as_tuple(obj) -> tuple :: Convert objects to tuple.
53
54     This function returns a tuple for any object. If the object is
55     a string or any non-sequence object, it returns a tuple with the
56     single value. If the object is a sequece or a generator, it returns
57     the conversion to a tuple of it.
58
59     Example:
60
61     >>> print f("hello")
62     ('hello',)
63     >>> print f([1,2,3])
64     (1, 2, 3)
65     >>> print f([[1,2,3],[6,7,8]])
66     ([1, 2, 3], [6, 7, 8])
67     >>> print f(dict(a=1, b=2))
68     (('a', 1), ('b', 2))
69     """
70     if isinstance(obj, basestring):
71         return (obj,)
72     if hasattr(obj, 'items'):
73         return tuple(obj.items())
74     if hasattr(obj, '__iter__'):
75         return tuple(obj)
76     return (obj,)
77
78 def as_table(obj):
79     r"""as_table(obj) -> tuple of tuples :: Convert objects to tuple of tuples.
80
81     This function returns a tuple of tuples for any object.
82
83     Example:
84
85     >>> print f("hello")
86     (('hello',),)
87     >>> print f([1,2,3])
88     ((1, 2, 3),)
89     >>> print f([[1,2,3],[6,7,8]])
90     ([1, 2, 3], [6, 7, 8])
91     >>> print f(dict(a=1, b=2))
92     (('a', 1), ('b', 2))
93     """
94     obj = as_tuple(obj)
95     for i in obj:
96         if isinstance(i, basestring):
97             return (obj,)
98         if hasattr(i, '__iter__'):
99             return obj
100         return (obj,)
101     else:
102         return ((),) # empty table
103
104
105 if __name__ == '__main__':
106
107     class A(Sequence):
108         def __init__(self):
109             self.a = 1
110             self.b = 2
111         def as_tuple(self):
112             return (self.a, self.b)
113
114     class B:
115         def __repr__(self):
116             return 'B()'
117
118     for i in A():
119         print i
120
121     print A()[1]
122
123     for f in (as_tuple, as_table):
124
125         print f.__name__
126
127         print f(A())
128
129         print f("hello")
130
131         print f([1,2,3])
132
133         print f([[1,2,3],[6,7,8]])
134
135         print f(B())
136
137         print f(dict(a=1, b=2))
138
139         print f([])
140