Merged revisions 61143-61144,61146-61147,61150-61151,61157,61165-61168,61170-61173,61176-61177,61183 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r61143 | barry.warsaw | 2008-03-01 03:23:38 +0100 (Sat, 01 Mar 2008) | 2 lines

  Bump to version 2.6a1
........
  r61144 | barry.warsaw | 2008-03-01 03:26:42 +0100 (Sat, 01 Mar 2008) | 1 line

  bump idle version number
........
  r61146 | fred.drake | 2008-03-01 03:45:07 +0100 (Sat, 01 Mar 2008) | 2 lines

  fix typo
........
  r61147 | barry.warsaw | 2008-03-01 03:53:36 +0100 (Sat, 01 Mar 2008) | 1 line

  Add date to NEWS
........
  r61150 | barry.warsaw | 2008-03-01 04:00:52 +0100 (Sat, 01 Mar 2008) | 1 line

  Give IDLE a release date
........
  r61151 | barry.warsaw | 2008-03-01 04:15:20 +0100 (Sat, 01 Mar 2008) | 1 line

  More copyright year and version number bumps
........
  r61157 | barry.warsaw | 2008-03-01 18:11:41 +0100 (Sat, 01 Mar 2008) | 2 lines

  Set things up for 2.6a2.
........
  r61165 | georg.brandl | 2008-03-02 07:28:16 +0100 (Sun, 02 Mar 2008) | 2 lines

  It's 2.6 now.
........
  r61166 | georg.brandl | 2008-03-02 07:32:32 +0100 (Sun, 02 Mar 2008) | 2 lines

  Update year.
........
  r61167 | georg.brandl | 2008-03-02 07:44:08 +0100 (Sun, 02 Mar 2008) | 2 lines

  Make patchlevel print out the release if called as a script.
........
  r61168 | georg.brandl | 2008-03-02 07:45:40 +0100 (Sun, 02 Mar 2008) | 2 lines

  New default basename for HTML help files.
........
  r61170 | raymond.hettinger | 2008-03-02 11:59:31 +0100 (Sun, 02 Mar 2008) | 1 line

  Finish-up docs for combinations() and permutations() in itertools.
........
  r61171 | raymond.hettinger | 2008-03-02 12:17:51 +0100 (Sun, 02 Mar 2008) | 1 line

  Tighten example code.
........
  r61172 | raymond.hettinger | 2008-03-02 12:57:16 +0100 (Sun, 02 Mar 2008) | 1 line

  Simplify code for itertools.product().
........
  r61173 | raymond.hettinger | 2008-03-02 13:02:19 +0100 (Sun, 02 Mar 2008) | 1 line

  Handle 0-tuples which can be singletons.
........
  r61176 | georg.brandl | 2008-03-02 14:41:39 +0100 (Sun, 02 Mar 2008) | 2 lines

  Make clear that the constants are strings.
........
  r61177 | georg.brandl | 2008-03-02 15:15:04 +0100 (Sun, 02 Mar 2008) | 2 lines

  Fix factual error.
........
  r61183 | gregory.p.smith | 2008-03-02 21:00:53 +0100 (Sun, 02 Mar 2008) | 4 lines

  Modify import of test_support so that the code can also be used with a
  stand alone distribution of bsddb that includes its own small copy of
  test_support for the needed functionality on older pythons.
........
This commit is contained in:
Christian Heimes 2008-03-02 22:46:37 +00:00
parent b0bf4b782f
commit b558a2e13a
23 changed files with 134 additions and 62 deletions

View File

@ -87,7 +87,7 @@ html_additional_pages = {
}
# Output file base name for HTML help builder.
htmlhelp_basename = 'pydoc'
htmlhelp_basename = 'python' + release.replace('.', '')
# Options for LaTeX output

View File

@ -4,7 +4,7 @@ Copyright
Python and this documentation is:
Copyright © 2001-2007 Python Software Foundation. All rights reserved.
Copyright © 2001-2008 Python Software Foundation. All rights reserved.
Copyright © 2000 BeOpen.com. All rights reserved.

View File

@ -102,26 +102,24 @@ loops that truncate the stream.
Each result tuple is ordered to match the input order. So, every
combination is a subsequence of the input *iterable*.
Example: ``combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)``
Equivalent to::
def combinations(iterable, r):
'combinations(range(4), 3) --> (0,1,2) (0,1,3) (0,2,3) (1,2,3)'
pool = tuple(iterable)
n = len(pool)
assert 0 <= r <= n
vec = range(r)
yield tuple(pool[i] for i in vec)
indices = range(r)
yield tuple(pool[i] for i in indices)
while 1:
for i in reversed(range(r)):
if vec[i] != i + n - r:
if indices[i] != i + n - r:
break
else:
return
vec[i] += 1
indices[i] += 1
for j in range(i+1, r):
vec[j] = vec[j-1] + 1
yield tuple(pool[i] for i in vec)
indices[j] = indices[j-1] + 1
yield tuple(pool[i] for i in indices)
.. versionadded:: 2.6
@ -356,7 +354,29 @@ loops that truncate the stream.
value. So if the input elements are unique, there will be no repeat
values in each permutation.
Example: ``permutations(range(3),2) --> (1,2) (1,3) (2,1) (2,3) (3,1) (3,2)``
Equivalent to::
def permutations(iterable, r=None):
'permutations(range(3), 2) --> (0,1) (0,2) (1,0) (1,2) (2,0) (2,1)'
pool = tuple(iterable)
n = len(pool)
r = n if r is None else r
indices = range(n)
cycles = range(n-r+1, n+1)[::-1]
yield tuple(pool[i] for i in indices[:r])
while n:
for i in reversed(range(r)):
cycles[i] -= 1
if cycles[i] == 0:
indices[i:] = indices[i+1:] + indices[i:i+1]
cycles[i] = n - i
else:
j = cycles[i]
indices[i], indices[-j] = indices[-j], indices[i]
yield tuple(pool[i] for i in indices[:r])
break
else:
return
.. versionadded:: 2.6

View File

@ -1630,27 +1630,28 @@ timed intervals.
You can use the *when* to specify the type of *interval*. The list of possible
values is, note that they are not case sensitive:
+----------+-----------------------+
| Value | Type of interval |
+==========+=======================+
| S | Seconds |
+----------+-----------------------+
| M | Minutes |
+----------+-----------------------+
| H | Hours |
+----------+-----------------------+
| D | Days |
+----------+-----------------------+
| W | Week day (0=Monday) |
+----------+-----------------------+
| midnight | Roll over at midnight |
+----------+-----------------------+
+----------------+-----------------------+
| Value | Type of interval |
+================+=======================+
| ``'S'`` | Seconds |
+----------------+-----------------------+
| ``'M'`` | Minutes |
+----------------+-----------------------+
| ``'H'`` | Hours |
+----------------+-----------------------+
| ``'D'`` | Days |
+----------------+-----------------------+
| ``'W'`` | Week day (0=Monday) |
+----------------+-----------------------+
| ``'midnight'`` | Roll over at midnight |
+----------------+-----------------------+
If *backupCount* is non-zero, the system will save old log files by appending
extensions to the filename. The extensions are date-and-time based, using the
strftime format ``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on
the rollover interval. At most *backupCount* files will be kept, and if more
would be created when rollover occurs, the oldest one is deleted.
The system will save old log files by appending extensions to the filename.
The extensions are date-and-time based, using the strftime format
``%Y-%m-%d_%H-%M-%S`` or a leading portion thereof, depending on the rollover
interval. If *backupCount* is nonzero, at most *backupCount* files will be
kept, and if more would be created when rollover occurs, the oldest one is
deleted.
.. method:: TimedRotatingFileHandler.doRollover()

View File

@ -120,7 +120,7 @@ Terms and conditions for accessing or otherwise using Python
analyze, test, perform and/or display publicly, prepare derivative works,
distribute, and otherwise use Python |release| alone or in any derivative
version, provided, however, that PSF's License Agreement and PSF's notice of
copyright, i.e., "Copyright © 2001-2007 Python Software Foundation; All Rights
copyright, i.e., "Copyright © 2001-2008 Python Software Foundation; All Rights
Reserved" are retained in Python |release| alone or in any derivative version
prepared by Licensee.

View File

@ -66,3 +66,6 @@ def get_version_info():
print >>sys.stderr, 'Can\'t get version info from Include/patchlevel.h, ' \
'using version of this interpreter (%s).' % release
return version, release
if __name__ == '__main__':
print get_header_version_info('.')[1]

View File

@ -24,6 +24,11 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbshelve
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
@ -107,7 +112,6 @@ class AssociateErrorTestCase(unittest.TestCase):
def tearDown(self):
self.env.close()
self.env = None
from test import test_support
test_support.rmtree(self.homeDir)
def test00_associateDBError(self):

View File

@ -9,7 +9,6 @@ import errno
import string
import tempfile
from pprint import pprint
from test import test_support
import unittest
import time
@ -21,6 +20,10 @@ except ImportError:
from bsddb import db
from bsddb.test.test_all import verbose
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
DASH = b'-'
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

View File

@ -16,6 +16,11 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbshelve
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
lexical_cmp = cmp
def lowercase_cmp(left, right):
@ -84,7 +89,6 @@ class AbstractBtreeKeyCompareTestCase (unittest.TestCase):
if self.env is not None:
self.env.close ()
self.env = None
from test import test_support
test_support.rmtree(self.homeDir)
def addDataToDB (self, data):

View File

@ -6,6 +6,11 @@ import tempfile
from bsddb import db
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
@ -39,7 +44,6 @@ class pget_bugTestCase(unittest.TestCase):
del self.secondary_db
del self.primary_db
del self.env
from test import test_support
test_support.rmtree(self.homeDir)
def test_pget(self):

View File

@ -11,6 +11,11 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbobj
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
@ -29,7 +34,6 @@ class dbobjTestCase(unittest.TestCase):
del self.db
if hasattr(self, 'env'):
del self.env
from test import test_support
test_support.rmtree(self.homeDir)
def test01_both(self):

View File

@ -9,6 +9,11 @@ import unittest
from bsddb import db, dbshelve
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
from bsddb.test.test_all import verbose
@ -279,7 +284,6 @@ class BasicEnvShelveTestCase(DBShelveTestCase):
def tearDown(self):
from test import test_support
test_support.rmtree(self.homeDir)
self.do_close()

View File

@ -34,6 +34,10 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbtables
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
@ -52,7 +56,6 @@ class TableDBTestCase(unittest.TestCase):
def tearDown(self):
self.tdb.close()
from test import test_support
test_support.rmtree(self.testHomeDir)
def test01(self):

View File

@ -15,6 +15,11 @@ except ImportError:
# For Python 2.3
from bsddb import db
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
from bsddb.test.test_all import verbose
# We're going to get warnings in this module about trying to close the db when
@ -41,7 +46,6 @@ class DBEnvClosedEarlyCrash(unittest.TestCase):
tempfile.tempdir = None
def tearDown(self):
from test import test_support
test_support.rmtree(self.homeDir)
def test01_close_dbenv_before_db(self):

View File

@ -18,6 +18,10 @@ from bsddb.test.test_all import verbose
from bsddb import db, dbshelve, StringKeys
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
@ -57,7 +61,6 @@ class JoinTestCase(unittest.TestCase):
def tearDown(self):
self.env.close()
from test import test_support
test_support.rmtree(self.homeDir)
def test01_join(self):

View File

@ -23,6 +23,11 @@ except ImportError:
# For Python 2.3
from bsddb import db
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
@ -37,7 +42,6 @@ class LockingTestCase(unittest.TestCase):
def tearDown(self):
self.env.close()
from test import test_support
test_support.rmtree(self.homeDir)

View File

@ -14,6 +14,11 @@ except ImportError:
# For the bundled bsddb
from bsddb import db, dbshelve, hashopen
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
class MiscTestCase(unittest.TestCase):
@ -27,7 +32,6 @@ class MiscTestCase(unittest.TestCase):
pass
def tearDown(self):
from test import test_support
test_support.unlink(self.filename)
test_support.rmtree(self.homeDir)

View File

@ -13,6 +13,11 @@ except ImportError as e:
# For Python 2.3
from bsddb import db
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
@ -31,7 +36,6 @@ class pickleTestCase(unittest.TestCase):
del self.db
if hasattr(self, 'env'):
del self.env
from test import test_support
test_support.rmtree(self.homeDir)
def _base_test_pickle_DBError(self, pickle):

View File

@ -18,6 +18,11 @@ except ImportError:
# For Python 2.3
from bsddb import db
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
@ -29,7 +34,6 @@ class SimpleRecnoTestCase(unittest.TestCase):
self.homeDir = None
def tearDown(self):
from test import test_support
test_support.unlink(self.filename)
if self.homeDir:
test_support.rmtree(self.homeDir)

View File

@ -11,6 +11,10 @@ except ImportError:
from bsddb import db
from bsddb.test.test_all import verbose
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
class DBSequenceTest(unittest.TestCase):
@ -41,7 +45,6 @@ class DBSequenceTest(unittest.TestCase):
self.dbenv.close()
del self.dbenv
from test import test_support
test_support.rmtree(self.homeDir)
def test_get(self):

View File

@ -33,6 +33,11 @@ except ImportError:
# For Python 2.3
from bsddb import db, dbutils
try:
from bsddb3 import test_support
except ImportError:
from test import test_support
#----------------------------------------------------------------------
@ -63,7 +68,6 @@ class BaseThreadedTestCase(unittest.TestCase):
self.d.open(self.filename, self.dbtype, self.dbopenflags|db.DB_CREATE)
def tearDown(self):
from test import test_support
test_support.rmtree(self.homeDir)
self.d.close()
self.env.close()

View File

@ -1740,7 +1740,6 @@ static PyTypeObject chain_type = {
typedef struct {
PyObject_HEAD
PyObject *pools; /* tuple of pool tuples */
Py_ssize_t *maxvec; /* size of each pool */
Py_ssize_t *indices; /* one index per pool */
PyObject *result; /* most recently returned result tuple */
int stopped; /* set to 1 when the product iterator is exhausted */
@ -1754,7 +1753,6 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
productobject *lz;
Py_ssize_t nargs, npools, repeat=1;
PyObject *pools = NULL;
Py_ssize_t *maxvec = NULL;
Py_ssize_t *indices = NULL;
Py_ssize_t i;
@ -1779,9 +1777,8 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
nargs = (repeat == 0) ? 0 : PyTuple_GET_SIZE(args);
npools = nargs * repeat;
maxvec = PyMem_Malloc(npools * sizeof(Py_ssize_t));
indices = PyMem_Malloc(npools * sizeof(Py_ssize_t));
if (maxvec == NULL || indices == NULL) {
if (indices == NULL) {
PyErr_NoMemory();
goto error;
}
@ -1795,16 +1792,13 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject *pool = PySequence_Tuple(item);
if (pool == NULL)
goto error;
PyTuple_SET_ITEM(pools, i, pool);
maxvec[i] = PyTuple_GET_SIZE(pool);
indices[i] = 0;
}
for ( ; i < npools; ++i) {
PyObject *pool = PyTuple_GET_ITEM(pools, i - nargs);
Py_INCREF(pool);
PyTuple_SET_ITEM(pools, i, pool);
maxvec[i] = maxvec[i - nargs];
indices[i] = 0;
}
@ -1814,7 +1808,6 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
goto error;
lz->pools = pools;
lz->maxvec = maxvec;
lz->indices = indices;
lz->result = NULL;
lz->stopped = 0;
@ -1822,8 +1815,6 @@ product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
return (PyObject *)lz;
error:
if (maxvec != NULL)
PyMem_Free(maxvec);
if (indices != NULL)
PyMem_Free(indices);
Py_XDECREF(pools);
@ -1836,7 +1827,6 @@ product_dealloc(productobject *lz)
PyObject_GC_UnTrack(lz);
Py_XDECREF(lz->pools);
Py_XDECREF(lz->result);
PyMem_Free(lz->maxvec);
PyMem_Free(lz->indices);
Py_TYPE(lz)->tp_free(lz);
}
@ -1883,7 +1873,6 @@ product_next(productobject *lz)
}
} else {
Py_ssize_t *indices = lz->indices;
Py_ssize_t *maxvec = lz->maxvec;
/* Copy the previous result tuple or re-use it if available */
if (Py_REFCNT(result) > 1) {
@ -1900,14 +1889,14 @@ product_next(productobject *lz)
Py_DECREF(old_result);
}
/* Now, we've got the only copy so we can update it in-place */
assert (Py_REFCNT(result) == 1);
assert (npools==0 || Py_REFCNT(result) == 1);
/* Update the pool indices right-to-left. Only advance to the
next pool when the previous one rolls-over */
for (i=npools-1 ; i >= 0 ; i--) {
pool = PyTuple_GET_ITEM(pools, i);
indices[i]++;
if (indices[i] == maxvec[i]) {
if (indices[i] == PyTuple_GET_SIZE(pool)) {
/* Roll-over and advance to next pool */
indices[i] = 0;
elem = PyTuple_GET_ITEM(pool, 0);

3
README
View File

@ -2,6 +2,9 @@ This is Python version 3.0 alpha 3
==================================
For notes specific to this release, see RELNOTES in this directory.
Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
Python Software Foundation.
All rights reserved.
Python 3000 (a.k.a. "Py3k", and released as Python 3.0) is a new
version of the language, which is incompatible with the 2.x line of