1# Some helper functions to get by without Python 2.4
2
3# set
4try:
5    set = set
6except NameError:
7    from sets import Set as set
8
9orig_cmp = cmp
10# [].sort
11def sort_list(l, cmp=None, key=None, reverse=False):
12    try:
13        l.sort(cmp, key, reverse)
14    except TypeError, e:
15        if not str(e).startswith('sort expected at most 1 arguments'):
16            raise
17        if cmp is None:
18            cmp = orig_cmp
19        if key is not None:
20            # the cmp=cmp parameter is required to get the original comparator
21            # into the lambda namespace
22            cmp = lambda self, other, cmp=cmp: cmp(key(self), key(other))
23        if reverse:
24            cmp = lambda self, other, cmp=cmp: -cmp(self,other)
25        l.sort(cmp)
26
27# sorted
28try:
29    sorted = sorted
30except NameError:
31    # global name 'sorted' doesn't exist in Python2.3
32    # this provides a poor-man's emulation of the sorted built-in method
33    def sorted(l, cmp=None, key=None, reverse=False):
34        sorted_list = list(l)
35        sort_list(sorted_list, cmp, key, reverse)
36        return sorted_list
37
38# rsplit
39try:
40    ''.rsplit
41    def rsplit(s, delim, maxsplit):
42        return s.rsplit(delim, maxsplit)
43
44except AttributeError:
45    def rsplit(s, delim, maxsplit):
46        """Return a list of the words of the string s, scanning s
47        from the end. To all intents and purposes, the resulting
48        list of words is the same as returned by split(), except
49        when the optional third argument maxsplit is explicitly
50        specified and nonzero. When maxsplit is nonzero, at most
51        maxsplit number of splits - the rightmost ones - occur,
52        and the remainder of the string is returned as the first
53        element of the list (thus, the list will have at most
54        maxsplit+1 elements). New in version 2.4.
55        >>> rsplit('foo.bar.baz', '.', 0)
56        ['foo.bar.baz']
57        >>> rsplit('foo.bar.baz', '.', 1)
58        ['foo.bar', 'baz']
59        >>> rsplit('foo.bar.baz', '.', 2)
60        ['foo', 'bar', 'baz']
61        >>> rsplit('foo.bar.baz', '.', 99)
62        ['foo', 'bar', 'baz']
63        """
64        assert maxsplit >= 0
65
66        if maxsplit == 0: return [s]
67
68        # the following lines perform the function, but inefficiently.
69        #  This may be adequate for compatibility purposes
70        items = s.split(delim)
71        if maxsplit < len(items):
72            items[:-maxsplit] = [delim.join(items[:-maxsplit])]
73        return items
74