Skip to content

Commit 43d70ed

Browse files
authored
Merge pull request #210 from blueyed/buitin
Clean up builtin for py27+
2 parents 24de093 + 7412944 commit 43d70ed

File tree

3 files changed

+17
-136
lines changed

3 files changed

+17
-136
lines changed

py/_builtin.py

Lines changed: 12 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,120 +1,21 @@
11
import sys
22

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'
1073

4+
# Passthrough for builtins supported with py27.
5+
BaseException = BaseException
6+
GeneratorExit = GeneratorExit
1087
_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
10915

110-
try:
111-
callable = callable
112-
except NameError:
113-
def callable(obj):
114-
return hasattr(obj, "__call__")
11516

11617
if sys.version_info >= (3, 0):
117-
exec ("print_ = print ; exec_=exec")
18+
exec("print_ = print ; exec_=exec")
11819
import builtins
11920

12021
# some backward compatibility helpers
@@ -131,13 +32,13 @@ def _totext(obj, encoding=None, errors=None):
13132

13233
def _isbytes(x):
13334
return isinstance(x, bytes)
35+
13436
def _istext(x):
13537
return isinstance(x, str)
13638

13739
text = str
13840
bytes = bytes
13941

140-
14142
def _getimself(function):
14243
return getattr(function, '__self__', None)
14344

testing/root/test_builtin.py

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import sys
22
import types
33
import py
4-
from py.builtin import set, frozenset, reversed, sorted
4+
from py.builtin import set, frozenset
55

66
def test_enumerate():
77
l = [0,1,2]
@@ -53,29 +53,6 @@ def test_frozenset():
5353
s = set([frozenset([0, 1]), frozenset([1, 0])])
5454
assert len(s) == 1
5555

56-
def test_sorted():
57-
if sorted == py.builtin.sorted:
58-
return # don't test a real builtin
59-
for s in [py.builtin.sorted]:
60-
def test():
61-
assert s([3, 2, 1]) == [1, 2, 3]
62-
assert s([1, 2, 3], reverse=True) == [3, 2, 1]
63-
l = s([1, 2, 3, 4, 5, 6], key=lambda x: x % 2)
64-
assert l == [2, 4, 6, 1, 3, 5]
65-
l = s([1, 2, 3, 4], cmp=lambda x, y: -cmp(x, y))
66-
assert l == [4, 3, 2, 1]
67-
l = s([1, 2, 3, 4], cmp=lambda x, y: -cmp(x, y),
68-
key=lambda x: x % 2)
69-
assert l == [1, 3, 2, 4]
70-
71-
def compare(x, y):
72-
assert type(x) == str
73-
assert type(y) == str
74-
return cmp(x, y)
75-
data = 'The quick Brown fox Jumped over The lazy Dog'.split()
76-
s(data, cmp=compare, key=str.lower)
77-
yield test
78-
7956

8057
def test_print_simple():
8158
from py.builtin import print_
@@ -116,7 +93,7 @@ class A:
11693

11794
def test_getfuncdict():
11895
def f():
119-
pass
96+
raise NotImplementedError
12097
f.x = 4
12198
assert py.builtin._getfuncdict(f)["x"] == 4
12299
assert py.builtin._getfuncdict(2) is None

tox.ini

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,6 @@ source = .
3939
parallel = 1
4040
[coverage:report]
4141
include = py/*,testing/*
42+
exclude_lines =
43+
#\s*(pragma|PRAGMA)[:\s]?\s*(no|NO)\s*(cover|COVER)
44+
^\s*raise NotImplementedError\b

0 commit comments

Comments
 (0)