diff options
-rw-r--r-- | Doc/library/functions.rst | 10 | ||||
-rw-r--r-- | Doc/whatsnew/2.6.rst | 90 | ||||
-rw-r--r-- | Lib/bsddb/test/test_lock.py | 58 | ||||
-rw-r--r-- | Lib/distutils/config.py | 2 | ||||
-rw-r--r-- | Lib/test/test_enumerate.py | 16 | ||||
-rw-r--r-- | Lib/test/test_generators.py | 11 | ||||
-rw-r--r-- | Lib/test/test_genexps.py | 2 | ||||
-rw-r--r-- | Lib/test/test_platform.py | 19 | ||||
-rw-r--r-- | Lib/test/test_site.py | 7 | ||||
-rw-r--r-- | Lib/test/test_warnings.py | 1 | ||||
-rw-r--r-- | Makefile.pre.in | 3 | ||||
-rw-r--r-- | Misc/NEWS | 9 | ||||
-rw-r--r-- | Misc/TextMate/Python-Dev.tmbundle/Snippets/2 to 3 - Module Deletion (docs).tmSnippet | 16 | ||||
-rw-r--r-- | Misc/TextMate/Python-Dev.tmbundle/info.plist | 2 | ||||
-rw-r--r-- | Objects/enumobject.c | 21 | ||||
-rw-r--r-- | Objects/genobject.c | 31 | ||||
-rw-r--r-- | Python/_warnings.c | 4 | ||||
-rw-r--r-- | Python/compile.c | 2 |
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 \ @@ -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; } |