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