1
1
import sys
2
2
3
- try :
4
- reversed = reversed
5
- except NameError :
6
- def reversed (sequence ):
7
- """reversed(sequence) -> reverse iterator over values of the sequence
8
-
9
- Return a reverse iterator
10
- """
11
- if hasattr (sequence , '__reversed__' ):
12
- return sequence .__reversed__ ()
13
- if not hasattr (sequence , '__getitem__' ):
14
- raise TypeError ("argument to reversed() must be a sequence" )
15
- return reversed_iterator (sequence )
16
-
17
- class reversed_iterator (object ):
18
-
19
- def __init__ (self , seq ):
20
- self .seq = seq
21
- self .remaining = len (seq )
22
-
23
- def __iter__ (self ):
24
- return self
25
-
26
- def next (self ):
27
- i = self .remaining
28
- if i > 0 :
29
- i -= 1
30
- item = self .seq [i ]
31
- self .remaining = i
32
- return item
33
- raise StopIteration
34
-
35
- def __length_hint__ (self ):
36
- return self .remaining
37
-
38
- try :
39
- any = any
40
- except NameError :
41
- def any (iterable ):
42
- for x in iterable :
43
- if x :
44
- return True
45
- return False
46
-
47
- try :
48
- all = all
49
- except NameError :
50
- def all (iterable ):
51
- for x in iterable :
52
- if not x :
53
- return False
54
- return True
55
-
56
- try :
57
- sorted = sorted
58
- except NameError :
59
- builtin_cmp = cmp # need to use cmp as keyword arg
60
-
61
- def sorted (iterable , cmp = None , key = None , reverse = 0 ):
62
- use_cmp = None
63
- if key is not None :
64
- if cmp is None :
65
- def use_cmp (x , y ):
66
- return builtin_cmp (x [0 ], y [0 ])
67
- else :
68
- def use_cmp (x , y ):
69
- return cmp (x [0 ], y [0 ])
70
- l = [(key (element ), element ) for element in iterable ]
71
- else :
72
- if cmp is not None :
73
- use_cmp = cmp
74
- l = list (iterable )
75
- if use_cmp is not None :
76
- l .sort (use_cmp )
77
- else :
78
- l .sort ()
79
- if reverse :
80
- l .reverse ()
81
- if key is not None :
82
- return [element for (_ , element ) in l ]
83
- return l
84
-
85
- try :
86
- set , frozenset = set , frozenset
87
- except NameError :
88
- from sets import set , frozenset
89
-
90
- # pass through
91
- enumerate = enumerate
92
-
93
- try :
94
- BaseException = BaseException
95
- except NameError :
96
- BaseException = Exception
97
-
98
- try :
99
- GeneratorExit = GeneratorExit
100
- except NameError :
101
- class GeneratorExit (Exception ):
102
- """ This exception is never raised, it is there to make it possible to
103
- write code compatible with CPython 2.5 even in lower CPython
104
- versions."""
105
- pass
106
- GeneratorExit .__module__ = 'exceptions'
107
3
4
+ # Passthrough for builtins supported with py27.
5
+ BaseException = BaseException
6
+ GeneratorExit = GeneratorExit
108
7
_sysex = (KeyboardInterrupt , SystemExit , MemoryError , GeneratorExit )
8
+ all = all
9
+ any = any
10
+ callable = callable
11
+ enumerate = enumerate
12
+ reversed = reversed
13
+ set , frozenset = set , frozenset
14
+ sorted = sorted
109
15
110
- try :
111
- callable = callable
112
- except NameError :
113
- def callable (obj ):
114
- return hasattr (obj , "__call__" )
115
16
116
17
if sys .version_info >= (3 , 0 ):
117
- exec ("print_ = print ; exec_=exec" )
18
+ exec ("print_ = print ; exec_=exec" )
118
19
import builtins
119
20
120
21
# some backward compatibility helpers
@@ -131,13 +32,13 @@ def _totext(obj, encoding=None, errors=None):
131
32
132
33
def _isbytes (x ):
133
34
return isinstance (x , bytes )
35
+
134
36
def _istext (x ):
135
37
return isinstance (x , str )
136
38
137
39
text = str
138
40
bytes = bytes
139
41
140
-
141
42
def _getimself (function ):
142
43
return getattr (function , '__self__' , None )
143
44
0 commit comments