[Jython-checkins] jython: Fix issue #1982: builtin function enumerate() should support an optional
jim.baker
jython-checkins at python.org
Thu May 15 06:19:55 CEST 2014
http://hg.python.org/jython/rev/4aaec46e3ee5
changeset: 7247:4aaec46e3ee5
user: Santoso Wijaya <santoso.wijaya at gmail.com>
date: Tue May 13 21:03:06 2014 -0700
summary:
Fix issue #1982: builtin function enumerate() should support an optional 'start' argument.
files:
Lib/test/test_enumerate.py | 3 +-
Lib/test/test_enumerate_jy.py | 43 ++++++++++
src/org/python/core/PyEnumerate.java | 19 ++-
src/org/python/core/PyEnumerateDerived.java | 4 +-
4 files changed, 59 insertions(+), 10 deletions(-)
diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py
--- a/Lib/test/test_enumerate.py
+++ b/Lib/test/test_enumerate.py
@@ -100,7 +100,8 @@
def test_argumentcheck(self):
self.assertRaises(TypeError, self.enum) # no arguments
self.assertRaises(TypeError, self.enum, 1) # wrong type (not iterable)
- self.assertRaises(TypeError, self.enum, 'abc', 2) # too many arguments
+ self.assertRaises(TypeError, self.enum, 'abc', 'a') # wrong type
+ self.assertRaises(TypeError, self.enum, 'abc', 2, 3) # too many arguments
def test_tuple_reuse(self):
# Tests an implementation detail where tuple is reused
diff --git a/Lib/test/test_enumerate_jy.py b/Lib/test/test_enumerate_jy.py
new file mode 100644
--- /dev/null
+++ b/Lib/test/test_enumerate_jy.py
@@ -0,0 +1,43 @@
+import unittest
+import sys
+
+from test import test_support
+
+
+class EnumerateJyTestCase(unittest.TestCase):
+
+ enum = enumerate
+ seq, start, res = 'abc', 5, [(5, 'a'), (6, 'b'), (7, 'c')]
+
+ def test_start_kwarg_1(self):
+ e = self.enum(self.seq, start=self.start)
+ self.assertEqual(iter(e), e)
+ self.assertEqual(list(e), self.res)
+
+ def test_start_kwarg_2(self):
+ e = self.enum(start=self.start, sequence=self.seq)
+ self.assertEqual(iter(e), e)
+ self.assertEqual(list(e), self.res)
+
+ def test_start_pos(self):
+ e = self.enum(self.seq, self.start)
+ self.assertEqual(iter(e), e)
+ self.assertEqual(list(e), self.res)
+
+
+def test_main(verbose=None):
+ testclasses = (EnumerateJyTestCase,)
+ test_support.run_unittest(*testclasses)
+
+ # verify reference counting
+ import sys
+ if verbose and hasattr(sys, "gettotalrefcount"):
+ counts = [None] * 5
+ for i in xrange(len(counts)):
+ test_support.run_unittest(*testclasses)
+ counts[i] = sys.gettotalrefcount()
+ print counts
+
+if __name__ == "__main__":
+ test_main(verbose=True)
+
diff --git a/src/org/python/core/PyEnumerate.java b/src/org/python/core/PyEnumerate.java
--- a/src/org/python/core/PyEnumerate.java
+++ b/src/org/python/core/PyEnumerate.java
@@ -23,14 +23,14 @@
super(subType);
}
- public PyEnumerate(PyType subType, PyObject seq) {
+ public PyEnumerate(PyType subType, PyObject seq, long start) {
super(subType);
- index = 0;
+ index = start;
sit = seq.__iter__();
}
- public PyEnumerate(PyObject seq) {
- this(TYPE, seq);
+ public PyEnumerate(PyObject seq, long start) {
+ this(TYPE, seq, start);
}
public PyObject next() {
@@ -50,14 +50,19 @@
@ExposedNew
public final static PyObject enumerate_new(PyNewWrapper new_, boolean init, PyType subtype,
PyObject[] args, String[] keywords) {
- if (args.length != 1) {
+ if (args.length > 2 || args.length <= 0) {
throw PyBuiltinCallable.DefaultInfo.unexpectedCall(args.length, false, "enumerate", 0,
1);
}
+
+ ArgParser ap = new ArgParser("enumerate", args, keywords, new String[] {"sequence", "start"});
+ PyObject seq = ap.getPyObject(0);
+ long start = (long) ap.getInt(1, 0);
+
if (new_.for_type == subtype) {
- return new PyEnumerate(args[0]);
+ return new PyEnumerate(seq, start);
} else {
- return new PyEnumerateDerived(subtype, args[0]);
+ return new PyEnumerateDerived(subtype, seq, start);
}
}
diff --git a/src/org/python/core/PyEnumerateDerived.java b/src/org/python/core/PyEnumerateDerived.java
--- a/src/org/python/core/PyEnumerateDerived.java
+++ b/src/org/python/core/PyEnumerateDerived.java
@@ -38,8 +38,8 @@
dict=new PyStringMap();
}
- public PyEnumerateDerived(PyType subtype,PyObject seq) {
- super(subtype,seq);
+ public PyEnumerateDerived(PyType subtype,PyObject seq,long start) {
+ super(subtype,seq,start);
slots=new PyObject[subtype.getNumSlots()];
dict=subtype.instDict();
}
--
Repository URL: http://hg.python.org/jython
More information about the Jython-checkins
mailing list