summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doc/library/functions.rst10
-rw-r--r--Doc/whatsnew/2.6.rst90
-rw-r--r--Lib/bsddb/test/test_lock.py58
-rw-r--r--Lib/distutils/config.py2
-rw-r--r--Lib/test/test_enumerate.py16
-rw-r--r--Lib/test/test_generators.py11
-rw-r--r--Lib/test/test_genexps.py2
-rw-r--r--Lib/test/test_platform.py19
-rw-r--r--Lib/test/test_site.py7
-rw-r--r--Lib/test/test_warnings.py1
-rw-r--r--Makefile.pre.in3
-rw-r--r--Misc/NEWS9
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet16
-rw-r--r--Misc/TextMate/Python-Dev.tmbundle/info.plist2
-rw-r--r--Objects/enumobject.c21
-rw-r--r--Objects/genobject.c31
-rw-r--r--Python/_warnings.c4
-rw-r--r--Python/compile.c2
18 files changed, 257 insertions, 47 deletions
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index 582abbf..def6ae6 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -325,15 +325,15 @@ are always available. They are listed here in alphabetical order.
< abs(b)``.
-.. function:: enumerate(sequence)
+.. function:: enumerate(sequence[, start=0])
Return an enumerate object. *sequence* must be a sequence, an
:term:`iterator`, or some other object which supports iteration. The
:meth:`__next__` method of the iterator returned by :func:`enumerate` returns a
- tuple containing a count (from zero) and the corresponding value obtained
- from iterating over *iterable*. :func:`enumerate` is useful for obtaining an
- indexed series: ``(0, seq[0])``, ``(1, seq[1])``, ``(2, seq[2])``, .... For
- example:
+ tuple containing a count (from *start* which defaults to 0) and the
+ corresponding value obtained from iterating over *iterable*.
+ :func:`enumerate` is useful for obtaining an indexed series: ``(0, seq[0])``,
+ ``(1, seq[1])``, ``(2, seq[2])``, .... For example:
>>> for i, season in enumerate(['Spring', 'Summer', 'Fall', 'Winter')]:
... print(i, season)
diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst
index c39c80a..31ea41d 100644
--- a/Doc/whatsnew/2.6.rst
+++ b/Doc/whatsnew/2.6.rst
@@ -1466,13 +1466,86 @@ New, Improved, and Deprecated Modules
As usual, Python's standard library received a number of enhancements and bug
fixes. Here's a partial list of the most notable changes, sorted alphabetically
by module name. Consult the :file:`Misc/NEWS` file in the source tree for a more
-complete list of changes, or look through the CVS logs for all the details.
-
-* (3.0-warning mode) The :mod:`audiodev` module is being deprecated,
- and has been removed from Python 3.0, so importing it now triggers a
- warning. The module hasn't been maintained for several versions,
- and is written against an outdated sound interface for SunOS and
- IRIX.
+complete list of changes, or look through the Subversion logs for all the
+details.
+
+* (3.0-warning mode) Python 3.0 will feature a reorganized standard
+ library; many outdated modules are being dropped,
+ and some modules are being renamed or moved into packages.
+ Python 2.6 running in 3.0-warning mode will warn about these modules
+ when they are imported.
+ The list of deprecated modules is:
+ :mod:`_builtinSuites`,
+ :mod:`aepack`,
+ :mod:`aetools`,
+ :mod:`aetypes`,
+ :mod:`applesingle`,
+ :mod:`appletrawmain`,
+ :mod:`appletrunner`,
+ :mod:`argvemulator`,
+ :mod:`Audio_mac`,
+ :mod:`audiodev`,
+ :mod:`autoGIL`,
+ :mod:`bgenlocations`,
+ :mod:`buildtools`,
+ :mod:`bundlebuilder`,
+ :mod:`Canvas`,
+ :mod:`Carbon`,
+ :mod:`cfmfile`,
+ :mod:`CodeWarrior`,
+ :mod:`ColorPicker`,
+ :mod:`compiler`,
+ :mod:`cd`,
+ :mod:`cddb`,
+ :mod:`cdplayer`,
+ :mod:`CL` and :mod:`cl`,
+ :mod:`cd`,
+ :mod:`cd`,
+ :mod:`dircache`,
+ :mod:`dl`,
+ :mod:`EasyDialogs`,
+ :mod:`Explorer`,
+ :mod:`Finder`,
+ :mod:`FrameWork`,
+ :mod:`findertools`,
+ :mod:`fpformat`,
+ :mod:`gensuitemodule`,
+ :mod:`ic`,
+ :mod:`icglue`,
+ :mod:`icopen`,
+ :mod:`ihooks`,
+ :mod:`imageop`,
+ :mod:`linuxaudiodev`,
+ :mod:`macerrors`,
+ :mod:`MacOS`,
+ :mod:`macostools`,
+ :mod:`macresource`,
+ :mod:`mhlib`,
+ :mod:`MiniAEFrame`,
+ :mod:`multifile`,
+ :mod:`Nav`,
+ :mod:`Netscape`,
+ :mod:`new`,
+ :mod:`OSATerminology`,
+ :mod:`pimp`,
+ :mod:`PixMapWrapper`,
+ :mod:`popen2`,
+ :mod:`pure`,
+ :mod:`StdSuites`,
+ :mod:`sv`,
+ :mod:`SystemEvents`,
+ :mod:`Terminal`,
+ :mod:`terminalcommand`,
+ :mod:`test.testall`,
+ :mod:`toaiff`,
+ :mod:`videoreader`.
+
+ The modules that have been renamed are:
+
+ * :mod:`ConfigParser` has become :mod:`configparser`.
+ * :mod:`copy_reg` has become :mod:`copyreg`.
+ * :mod:`SocketServer` has become :mod:`socketserver`.
+ * :mod:`Queue` has become :mod:`queue`.
* The :mod:`bsddb.dbshelve` module now uses the highest pickling protocol
available, instead of restricting itself to protocol 1.
@@ -1755,9 +1828,6 @@ complete list of changes, or look through the CVS logs for all the details.
the forward search.
(Contributed by John Lenton.)
-* (3.0-warning mode) The :mod:`new` module has been removed from
- Python 3.0. Importing it therefore triggers a warning message.
-
* The :mod:`operator` module gained a
:func:`methodcaller` function that takes a name and an optional
set of arguments, returning a callable that will call
diff --git a/Lib/bsddb/test/test_lock.py b/Lib/bsddb/test/test_lock.py
index 973bc42..402d147 100644
--- a/Lib/bsddb/test/test_lock.py
+++ b/Lib/bsddb/test/test_lock.py
@@ -94,15 +94,55 @@ class LockingTestCase(unittest.TestCase):
for t in threads:
t.join()
- def test03_set_timeout(self):
- # test that the set_timeout call works
- if hasattr(self.env, 'set_timeout'):
- self.env.set_timeout(0, db.DB_SET_LOCK_TIMEOUT)
- self.env.set_timeout(0, db.DB_SET_TXN_TIMEOUT)
- self.env.set_timeout(123456, db.DB_SET_LOCK_TIMEOUT)
- self.env.set_timeout(7890123, db.DB_SET_TXN_TIMEOUT)
-
- def theThread(self, sleepTime, lockType):
+ def _DISABLED_test03_lock_timeout(self):
+ # Disabled as this test crashes the python interpreter built in
+ # debug mode with:
+ # Fatal Python error: UNREF invalid object
+ # the error occurs as marked below.
+ self.env.set_timeout(0, db.DB_SET_LOCK_TIMEOUT)
+ self.env.set_timeout(0, db.DB_SET_TXN_TIMEOUT)
+ self.env.set_timeout(123456, db.DB_SET_LOCK_TIMEOUT)
+ self.env.set_timeout(7890123, db.DB_SET_TXN_TIMEOUT)
+
+ def deadlock_detection() :
+ while not deadlock_detection.end :
+ deadlock_detection.count = \
+ self.env.lock_detect(db.DB_LOCK_EXPIRE)
+ if deadlock_detection.count :
+ while not deadlock_detection.end :
+ pass
+ break
+ time.sleep(0.01)
+
+ deadlock_detection.end=False
+ deadlock_detection.count=0
+ t=Thread(target=deadlock_detection)
+ t.setDaemon(True)
+ t.start()
+ self.env.set_timeout(100000, db.DB_SET_LOCK_TIMEOUT)
+ anID = self.env.lock_id()
+ anID2 = self.env.lock_id()
+ self.assertNotEqual(anID, anID2)
+ lock = self.env.lock_get(anID, "shared lock", db.DB_LOCK_WRITE)
+ start_time=time.time()
+ # FIXME: I see the UNREF crash as the interpreter trys to exit
+ # from this call to lock_get.
+ self.assertRaises(db.DBLockNotGrantedError,
+ self.env.lock_get,anID2, "shared lock", db.DB_LOCK_READ)
+ end_time=time.time()
+ deadlock_detection.end=True
+ self.assertTrue((end_time-start_time) >= 0.1)
+ self.env.lock_put(lock)
+ t.join()
+
+ if db.version() >= (4,0):
+ self.env.lock_id_free(anID)
+ self.env.lock_id_free(anID2)
+
+ if db.version() >= (4,6):
+ self.assertTrue(deadlock_detection.count>0)
+
+ def theThread(self, lockType):
name = currentThread().getName()
if lockType == db.DB_LOCK_WRITE:
lt = "write"
diff --git a/Lib/distutils/config.py b/Lib/distutils/config.py
index a625aec..6ffccaa 100644
--- a/Lib/distutils/config.py
+++ b/Lib/distutils/config.py
@@ -7,7 +7,7 @@ import os
import sys
from configparser import ConfigParser
-from distutils.core import Command
+from distutils.cmd import Command
DEFAULT_PYPIRC = """\
[pypirc]
diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py
index 08229bf..8cebf44 100644
--- a/Lib/test/test_enumerate.py
+++ b/Lib/test/test_enumerate.py
@@ -100,7 +100,8 @@ class EnumerateTestCase(unittest.TestCase):
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
@@ -196,6 +197,19 @@ class TestReversed(unittest.TestCase):
self.assertEqual(rc, sys.getrefcount(r))
+class TestStart(EnumerateTestCase):
+
+ enum = lambda i: enumerate(i, start=11)
+ seq, res = 'abc', [(1, 'a'), (2, 'b'), (3, 'c')]
+
+
+class TestLongStart(EnumerateTestCase):
+
+ enum = lambda i: enumerate(i, start=sys.maxsize+1)
+ seq, res = 'abc', [(sys.maxsize+1,'a'), (sys.maxsize+2,'b'),
+ (sys.maxsize+3,'c')]
+
+
def test_main(verbose=None):
testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig,
TestReversed)
diff --git a/Lib/test/test_generators.py b/Lib/test/test_generators.py
index 992126f..e27eadd 100644
--- a/Lib/test/test_generators.py
+++ b/Lib/test/test_generators.py
@@ -917,6 +917,17 @@ StopIteration
>>> g.gi_code is f.__code__
True
+
+Test the __name__ attribute and the repr()
+
+>>> def f():
+... yield 5
+...
+>>> g = f()
+>>> g.__name__
+'f'
+>>> repr(g) # doctest: +ELLIPSIS
+'<f generator object at ...>'
"""
# conjoin is a simple backtracking generator, named in honor of Icon's
diff --git a/Lib/test/test_genexps.py b/Lib/test/test_genexps.py
index 46f7ab8..c8abbcc 100644
--- a/Lib/test/test_genexps.py
+++ b/Lib/test/test_genexps.py
@@ -92,7 +92,7 @@ Verify that parenthesis are required when used as a keyword argument value
Verify that parenthesis are required when used as a keyword argument value
>>> dict(a = (i for i in range(10))) #doctest: +ELLIPSIS
- {'a': <generator object at ...>}
+ {'a': <<genexpr> generator object at ...>}
Verify early binding for the outermost for-expression
diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py
index 22307cd..fced4d0 100644
--- a/Lib/test/test_platform.py
+++ b/Lib/test/test_platform.py
@@ -1,7 +1,9 @@
+import sys
import unittest
-from test import test_support
import platform
+from test import test_support
+
class PlatformTest(unittest.TestCase):
def test_architecture(self):
res = platform.architecture()
@@ -49,26 +51,35 @@ class PlatformTest(unittest.TestCase):
def test_uname(self):
res = platform.uname()
+ self.assert_(any(res))
def test_java_ver(self):
res = platform.java_ver()
+ if sys.platform == 'java':
+ self.assert_(all(res))
def test_win32_ver(self):
res = platform.win32_ver()
def test_mac_ver(self):
res = platform.mac_ver()
+ try:
+ import gestalt
+ except ImportError: pass
+ else:
+ if sys.platform == 'darwin':
+ self.assert_(all(res))
def test_dist(self):
res = platform.dist()
def test_libc_ver(self):
- from sys import executable
import os
- if os.path.isdir(executable) and os.path.exists(executable+'.exe'):
+ if os.path.isdir(sys.executable) and \
+ os.path.exists(sys.executable+'.exe'):
# Cygwin horror
executable = executable + '.exe'
- res = platform.libc_ver(executable)
+ res = platform.libc_ver(sys.executable)
def test_main():
test_support.run_unittest(
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
index 329df4b..a13751c 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -36,7 +36,7 @@ class HelperFunctionsTests(unittest.TestCase):
"""Save a copy of sys.path"""
self.sys_path = sys.path[:]
-
+ def tearDown(self):
"""Restore sys.path"""
sys.path = self.sys_path
@@ -256,13 +256,8 @@ class ImportSideEffectTests(unittest.TestCase):
else:
self.fail("sitecustomize not imported automatically")
-
-
-
def test_main():
run_unittest(HelperFunctionsTests, ImportSideEffectTests)
-
-
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
index fa2297c..7b512ef 100644
--- a/Lib/test/test_warnings.py
+++ b/Lib/test/test_warnings.py
@@ -396,6 +396,7 @@ class _WarningsTests(BaseTest):
self.assertRaises(TypeError, self.module.warn, "Warning!")
finally:
self.module.showwarning = old_showwarning
+ self.module.resetwarnings()
def test_show_warning_output(self):
# With showarning() missing, make sure that output is okay.
diff --git a/Makefile.pre.in b/Makefile.pre.in
index b82bd5e..3b96df7 100644
--- a/Makefile.pre.in
+++ b/Makefile.pre.in
@@ -812,9 +812,10 @@ LIBSUBDIRS= lib-tk site-packages test test/output test/data \
test/decimaltestdata \
encodings \
email email/mime email/test email/test/data \
+ json json/tests \
sqlite3 sqlite3/test \
logging bsddb bsddb/test csv wsgiref \
- lib2to3 lib2to3/fixes lib2to3/pgen2 \
+ lib2to3 lib2to3/fixes lib2to3/pgen2 lib2to3/tests \
ctypes ctypes/test ctypes/macholib idlelib idlelib/Icons \
distutils distutils/command distutils/tests $(XMLLIBSUBDIRS) \
setuptools setuptools/command setuptools/tests setuptools.egg-info \
diff --git a/Misc/NEWS b/Misc/NEWS
index 2dbd2fd..6eb022d 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -17,6 +17,15 @@ Core and Builtins
"s#" code already does. The "z" code was corrected as well.
- Issue 2801: fix bug in the float.is_integer method where a ValueError
+
+- Issue #2863: generators now have a ``gen.__name__`` attribute that equals
+ ``gen.gi_code.co_name``, like ``func.__name___`` that equals
+ ``func.func_code.co_name``. The repr() of a generator now also contains
+ this name.
+
+- Issue #2831: enumerate() now has a ``start`` argument.
+
+- Issue #2801: fix bug in the float.is_integer method where a ValueError
was sometimes incorrectly raised.
- The --with-toolbox-glue option (and the associated pymactoolbox.h) have been
diff --git a/Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet b/Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet
new file mode 100644
index 0000000..5de8bae
--- /dev/null
+++ b/Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>content</key>
+ <string>.. deprecated:: 2.6
+ The :mod:\`${1}\` module has been deprecated for removal in Python 3.0.
+${0}</string>
+ <key>name</key>
+ <string>2 to 3 - Module Deletion (docs)</string>
+ <key>tabTrigger</key>
+ <string>2to3docdel</string>
+ <key>uuid</key>
+ <string>0568410D-EAF1-4AF3-B6DE-8AF133A91821</string>
+</dict>
+</plist>
diff --git a/Misc/TextMate/Python-Dev.tmbundle/info.plist b/Misc/TextMate/Python-Dev.tmbundle/info.plist
index 644bc7e..0510d5d 100644
--- a/Misc/TextMate/Python-Dev.tmbundle/info.plist
+++ b/Misc/TextMate/Python-Dev.tmbundle/info.plist
@@ -7,6 +7,7 @@
<key>items</key>
<array>
<string>9519C22B-6AB8-41A1-94F6-079E0B45C147</string>
+ <string>0568410D-EAF1-4AF3-B6DE-8AF133A91821</string>
<string>------------------------------------</string>
<string>B545BB1B-A8E1-426C-B50A-426E78B96D38</string>
<string>6EF151E5-7149-4F82-8796-0CC40FE589FA</string>
@@ -23,6 +24,7 @@
<key>ordering</key>
<array>
<string>9519C22B-6AB8-41A1-94F6-079E0B45C147</string>
+ <string>0568410D-EAF1-4AF3-B6DE-8AF133A91821</string>
<string>B545BB1B-A8E1-426C-B50A-426E78B96D38</string>
<string>6EF151E5-7149-4F82-8796-0CC40FE589FA</string>
<string>FD25A8DC-22DC-4ED4-B222-B943C8A9117D</string>
diff --git a/Objects/enumobject.c b/Objects/enumobject.c
index 5a08e6d..08c7c09 100644
--- a/Objects/enumobject.c
+++ b/Objects/enumobject.c
@@ -15,18 +15,29 @@ enum_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
enumobject *en;
PyObject *seq = NULL;
- static char *kwlist[] = {"sequence", 0};
+ PyObject *start = NULL;
+ static char *kwlist[] = {"sequence", "start", 0};
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:enumerate", kwlist,
- &seq))
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:enumerate", kwlist,
+ &seq, &start))
return NULL;
en = (enumobject *)type->tp_alloc(type, 0);
if (en == NULL)
return NULL;
- en->en_index = 0;
+ if (start) {
+ start = PyNumber_Index(start);
+ if (start == NULL) {
+ Py_DECREF(en);
+ return NULL;
+ }
+ en->en_index = LONG_MAX;
+ en->en_longindex = start;
+ } else {
+ en->en_index = 0;
+ en->en_longindex = NULL;
+ }
en->en_sit = PyObject_GetIter(seq);
- en->en_longindex = NULL;
if (en->en_sit == NULL) {
Py_DECREF(en);
return NULL;
diff --git a/Objects/genobject.c b/Objects/genobject.c
index 5897867..c76bcb6 100644
--- a/Objects/genobject.c
+++ b/Objects/genobject.c
@@ -282,6 +282,33 @@ gen_iternext(PyGenObject *gen)
}
+static PyObject *
+gen_repr(PyGenObject *gen)
+{
+ return PyUnicode_FromFormat("<%S generator object at %p>",
+ ((PyCodeObject *)gen->gi_code)->co_name,
+ gen);
+}
+
+
+static PyObject *
+gen_get_name(PyGenObject *gen)
+{
+ PyObject *name = ((PyCodeObject *)gen->gi_code)->co_name;
+ Py_INCREF(name);
+ return name;
+}
+
+
+PyDoc_STRVAR(gen__name__doc__,
+"Return the name of the generator's associated code object.");
+
+static PyGetSetDef gen_getsetlist[] = {
+ {"__name__", (getter)gen_get_name, NULL, NULL, gen__name__doc__},
+ {NULL}
+};
+
+
static PyMemberDef gen_memberlist[] = {
{"gi_frame", T_OBJECT, offsetof(PyGenObject, gi_frame), READONLY},
{"gi_running", T_INT, offsetof(PyGenObject, gi_running), READONLY},
@@ -307,7 +334,7 @@ PyTypeObject PyGen_Type = {
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
- 0, /* tp_repr */
+ (reprfunc)gen_repr, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
@@ -327,7 +354,7 @@ PyTypeObject PyGen_Type = {
(iternextfunc)gen_iternext, /* tp_iternext */
gen_methods, /* tp_methods */
gen_memberlist, /* tp_members */
- 0, /* tp_getset */
+ gen_getsetlist, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
diff --git a/Python/_warnings.c b/Python/_warnings.c
index 12b1021..8ccd4bb 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -408,8 +408,10 @@ warn_explicit(PyObject *category, PyObject *message,
/* A proper implementation of warnings.showwarning() should
have at least two default arguments. */
if ((defaults == NULL) || (PyTuple_Size(defaults) < 2)) {
- if (PyErr_WarnEx(PyExc_DeprecationWarning, msg, 1) < 0)
+ if (PyErr_WarnEx(PyExc_DeprecationWarning, msg, 1) < 0) {
+ Py_DECREF(show_fxn);
goto cleanup;
+ }
}
res = PyObject_CallFunctionObjArgs(show_fxn, message, category,
filename, lineno_obj,
diff --git a/Python/compile.c b/Python/compile.c
index 94a2715..6cc5c4a 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2984,7 +2984,7 @@ compiler_genexp(struct compiler *c, expr_ty e)
{
static identifier name;
if (!name) {
- name = PyUnicode_FromString("<genexp>");
+ name = PyUnicode_FromString("<genexpr>");
if (!name)
return 0;
}