]> git.llucax.com Git - software/pymin.git/blob - pymin/seqtools.py
Move handler decorator help checking to avoid an extra level in the stack trace.
[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 __cmp__(self, other):
52         return cmp(self.as_tuple(), other.as_tuple())
53
54 def as_tuple(obj):
55     r"""as_tuple(obj) -> tuple :: Convert objects to tuple.
56
57     This function returns a tuple for any object. If the object is
58     a string or any non-sequence object, it returns a tuple with the
59     single value. If the object is a sequece or a generator, it returns
60     the conversion to a tuple of it.
61
62     Example:
63
64     >>> print f("hello")
65     ('hello',)
66     >>> print f([1,2,3])
67     (1, 2, 3)
68     >>> print f([[1,2,3],[6,7,8]])
69     ([1, 2, 3], [6, 7, 8])
70     >>> print f(dict(a=1, b=2))
71     (('a', 1), ('b', 2))
72     """
73     if isinstance(obj, basestring):
74         return (obj,)
75     if hasattr(obj, 'items'):
76         return tuple(obj.items())
77     if hasattr(obj, '__iter__'):
78         return tuple(obj)
79     return (obj,)
80
81 def as_table(obj):
82     r"""as_table(obj) -> tuple of tuples :: Convert objects to tuple of tuples.
83
84     This function returns a tuple of tuples for any object.
85
86     Example:
87
88     >>> print f("hello")
89     (('hello',),)
90     >>> print f([1,2,3])
91     ((1, 2, 3),)
92     >>> print f([[1,2,3],[6,7,8]])
93     ([1, 2, 3], [6, 7, 8])
94     >>> print f(dict(a=1, b=2))
95     (('a', 1), ('b', 2))
96     """
97     obj = as_tuple(obj)
98     for i in obj:
99         if isinstance(i, basestring):
100             return (obj,)
101         if hasattr(i, '__iter__'):
102             return obj
103         return (obj,)
104     else:
105         return ((),) # empty table
106
107
108 if __name__ == '__main__':
109
110     class A(Sequence):
111         def __init__(self):
112             self.a = 1
113             self.b = 2
114         def as_tuple(self):
115             return (self.a, self.b)
116
117     class B:
118         def __repr__(self):
119             return 'B()'
120
121     for i in A():
122         print i
123
124     print A()[1]
125
126     for f in (as_tuple, as_table):
127
128         print f.__name__
129
130         print f(A())
131
132         print f("hello")
133
134         print f([1,2,3])
135
136         print f([[1,2,3],[6,7,8]])
137
138         print f(B())
139
140         print f(dict(a=1, b=2))
141
142         print f([])
143