]> git.llucax.com Git - software/pymin.git/blob - seqtools.py
22d0283b8c1dc46bcd7c55bb67ace94ea0d609b0
[software/pymin.git] / 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     if isinstance(obj, basestring):
47         return (obj,)
48     if hasattr(obj, 'items'):
49         return tuple(obj.items())
50     if hasattr(obj, '__iter__'):
51         return tuple(obj)
52     return (obj,)
53
54 def as_table(obj):
55     obj = as_tuple(obj)
56     for i in obj:
57         if isinstance(i, basestring):
58             return (obj,)
59         if hasattr(i, '__iter__'):
60             return obj
61         return (obj,)
62
63
64 if __name__ == '__main__':
65
66     class A(Sequence):
67         def __init__(self):
68             self.a = 1
69             self.b = 2
70         def as_tuple(self):
71             return (self.a, self.b)
72
73     class B:
74         def __repr__(self):
75             return 'B()'
76
77     for i in A():
78         print i
79
80     print A()[1]
81
82     for f in (as_tuple, as_table):
83
84         print f.__name__
85
86         print f(A())
87
88         print f("hello")
89
90         print f([1,2,3])
91
92         print f([[1,2,3],[6,7,8]])
93
94         print f(B())
95
96         print f(dict(a=1, b=2))
97