diff options
-rw-r--r-- | Doc/Makefile | 11 | ||||
-rw-r--r-- | Doc/conf.py | 38 | ||||
-rw-r--r-- | Doc/library/objects.rst | 2 | ||||
-rw-r--r-- | Doc/library/othergui.rst | 6 | ||||
-rw-r--r-- | Doc/library/stdtypes.rst | 2 | ||||
-rw-r--r-- | Doc/library/turtle.rst | 2 | ||||
-rw-r--r-- | Doc/using/windows.rst | 4 | ||||
-rw-r--r-- | Doc/whatsnew/2.6.rst | 14 | ||||
-rw-r--r-- | Lib/decimal.py | 132 | ||||
-rw-r--r-- | Lib/test/output/test_pep277 | 3 | ||||
-rw-r--r-- | Lib/test/test_pep277.py | 9 | ||||
-rw-r--r-- | Objects/listobject.c | 10 | ||||
-rwxr-xr-x | configure | 10 | ||||
-rw-r--r-- | configure.in | 10 |
14 files changed, 110 insertions, 143 deletions
diff --git a/Doc/Makefile b/Doc/Makefile index 84a297a..22f852b 100644 --- a/Doc/Makefile +++ b/Doc/Makefile @@ -7,16 +7,19 @@ PYTHON = python2.5 SVNROOT = http://svn.python.org/projects SPHINXOPTS = +PAPER = -ALLSPHINXOPTS = -b$(BUILDER) -dbuild/doctrees $(SPHINXOPTS) . build/$(BUILDER) +ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees -D latex_paper_size=$(PAPER) \ + $(SPHINXOPTS) . build/$(BUILDER) .PHONY: help checkout update build html web htmlhelp clean help: @echo "Please use \`make <target>' where <target> is one of" - @echo " html to make standalone HTML files" - @echo " web to make file usable by Sphinx.web" + @echo " html to make standalone HTML files" + @echo " web to make file usable by Sphinx.web" @echo " htmlhelp to make HTML files and a HTML help project" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" checkout: @if [ ! -d tools/sphinx ]; then \ @@ -60,6 +63,8 @@ htmlhelp: build latex: BUILDER = latex latex: build @echo "Build finished; the LaTeX files are in build/latex." + @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ + "run these through (pdf)latex." clean: -rm -rf build/* diff --git a/Doc/conf.py b/Doc/conf.py index 6736f53..29137e2 100644 --- a/Doc/conf.py +++ b/Doc/conf.py @@ -4,7 +4,9 @@ # # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed automatically). -# + +# General configuration +# --------------------- # The default replacements for |version| and |release|. # If 'auto', Sphinx looks for the Include/patchlevel.h file in the current Python @@ -23,9 +25,6 @@ today = '' # Else, today_fmt is used as the format for a strftime call. today_fmt = '%B %d, %Y' -# The base URL for download links. -download_base_url = 'http://docs.python.org/ftp/python/doc/' - # List of files that shouldn't be included in the build. unused_files = [ 'whatsnew/2.0.rst', @@ -40,17 +39,34 @@ unused_files = [ 'library/xml.etree.rst', ] +# If true, '()' will be appended to :func: etc. cross-reference text. +add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +add_module_names = True + + +# Options for HTML output +# ----------------------- + +# The base URL for download links. +html_download_base_url = 'http://docs.python.org/ftp/python/doc/' + # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -last_updated_format = '%b %d, %Y' +html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -use_smartypants = True +html_use_smartypants = True -# If true, '()' will be appended to :func: etc. cross-reference text. -add_function_parentheses = True -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -add_module_names = True +# Options for LaTeX output +# ------------------------ + +# The paper size ("letter" or "a4"). +latex_paper_size = "a4" + +# The font size ("10pt", "11pt" or "12pt"). +latex_font_size = "10pt" diff --git a/Doc/library/objects.rst b/Doc/library/objects.rst index a0e66d1..1b75161 100644 --- a/Doc/library/objects.rst +++ b/Doc/library/objects.rst @@ -16,7 +16,7 @@ Names for built-in exceptions and functions and a number of constants are found in a separate symbol table. This table is searched last when the interpreter looks up the meaning of a name, so local and global user-defined names can override built-in names. Built-in types are described together here for easy -reference. [#]_ +reference. The tables in this chapter document the priorities of operators by listing them in order of ascending priority (within a table) and grouping operators that have diff --git a/Doc/library/othergui.rst b/Doc/library/othergui.rst index 91b59e0..5a84285 100644 --- a/Doc/library/othergui.rst +++ b/Doc/library/othergui.rst @@ -63,14 +63,14 @@ also available for Python: `wxPython <http://www.wxpython.org>`_ wxPython is a cross-platform GUI toolkit for Python that is built around the popular `wxWidgets <http://www.wxwidgets.org/>`_ (formerly wxWindows) - C++ toolkit. It provides a native look and feel for applications on + C++ toolkit. It provides a native look and feel for applications on Windows, Mac OS X, and Unix systems by using each platform's native - widgets where ever possible, (GTK+ on Unix-like systems). In addition to + widgets where ever possible, (GTK+ on Unix-like systems). In addition to an extensive set of widgets, wxPython provides classes for online documentation and context sensitive help, printing, HTML viewing, low-level device context drawing, drag and drop, system clipboard access, an XML-based resource format and more, including an ever growing library - of user-contributed modules. wxPython has a book, `wxPython in Action + of user-contributed modules. wxPython has a book, `wxPython in Action <http://www.amazon.com/exec/obidos/ASIN/1932394621>`_, by Noel Rappin and Robin Dunn. diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 6822e7e..6dd374f 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -608,7 +608,7 @@ Notes: (5) The slice of *s* from *i* to *j* with step *k* is defined as the sequence of - items with index ``x = i + n*k`` such that 0 ≤n < (j-i)/(k). In other words, + items with index ``x = i + n*k`` such that ``0 <= n < (j-i)/k``. In other words, the indices are ``i``, ``i+k``, ``i+2*k``, ``i+3*k`` and so on, stopping when *j* is reached (but never including *j*). If *i* or *j* is greater than ``len(s)``, use ``len(s)``. If *i* or *j* are omitted or ``None``, they become diff --git a/Doc/library/turtle.rst b/Doc/library/turtle.rst index b772c88..8ad3b61 100644 --- a/Doc/library/turtle.rst +++ b/Doc/library/turtle.rst @@ -285,5 +285,5 @@ corresponding to a full circle: .. method:: Turtle.degrees([fullcircle]) *fullcircle* is by default 360. This can cause the pen to have any angular units - whatever: give *fullcircle* 2\*$π for radians, or 400 for gradians. + whatever: give *fullcircle* ``2*pi`` for radians, or 400 for gradians. diff --git a/Doc/using/windows.rst b/Doc/using/windows.rst index 9a16938..035f405 100644 --- a/Doc/using/windows.rst +++ b/Doc/using/windows.rst @@ -276,9 +276,7 @@ releases are built, the source tree contains solutions/project files. View the +--------------------+--------------+-----------------------+ | Directory | MSVC version | Visual Studio version | +====================+==============+=======================+ -| :file:`PC/VC6/` | 5.0 | 97 | -| +--------------+-----------------------+ -| | 6.0 | 6.0 | +| :file:`PC/VC6/` | 6.0 | 97 | +--------------------+--------------+-----------------------+ | :file:`PCbuild/` | 7.1 | 2003 | +--------------------+--------------+-----------------------+ diff --git a/Doc/whatsnew/2.6.rst b/Doc/whatsnew/2.6.rst index c63cc32..f21ff72 100644 --- a/Doc/whatsnew/2.6.rst +++ b/Doc/whatsnew/2.6.rst @@ -202,7 +202,7 @@ A high-level explanation of the context management protocol is: methods. * The context manager's :meth:`__enter__` method is called. The value returned - is assigned to *VAR*. If no ``'as VAR'`` clause is present, the value is simply + is assigned to *VAR*. If no ``as VAR`` clause is present, the value is simply discarded. * The code in *BLOCK* is executed. @@ -242,11 +242,11 @@ rolled back if there's an exception. Here's the basic interface for class DatabaseConnection: # Database interface - def cursor (self): + def cursor(self): "Returns a cursor object and starts a new transaction" - def commit (self): + def commit(self): "Commits current transaction" - def rollback (self): + def rollback(self): "Rolls back current transaction" The :meth:`__enter__` method is pretty easy, having only to start a new @@ -256,7 +256,7 @@ their ':keyword:`with`' statement to bind the cursor to a variable name. :: class DatabaseConnection: ... - def __enter__ (self): + def __enter__(self): # Code to start a new transaction cursor = self.cursor() return cursor @@ -273,7 +273,7 @@ add a :keyword:`return` statement at the marked location. :: class DatabaseConnection: ... - def __exit__ (self, type, value, tb): + def __exit__(self, type, value, tb): if tb is None: # No exception, so commit self.commit() @@ -306,7 +306,7 @@ decorator as:: from contextlib import contextmanager @contextmanager - def db_transaction (connection): + def db_transaction(connection): cursor = connection.cursor() try: yield cursor diff --git a/Lib/decimal.py b/Lib/decimal.py index ba335bb..b25f6e6 100644 --- a/Lib/decimal.py +++ b/Lib/decimal.py @@ -147,10 +147,6 @@ ROUND_UP = 'ROUND_UP' ROUND_HALF_DOWN = 'ROUND_HALF_DOWN' ROUND_05UP = 'ROUND_05UP' -# Rounding decision (not part of the public API) -NEVER_ROUND = 'NEVER_ROUND' # Round in division (non-divmod), sqrt ONLY -ALWAYS_ROUND = 'ALWAYS_ROUND' # Every operation rounds at end. - # Errors class DecimalException(ArithmeticError): @@ -932,9 +928,7 @@ class Decimal(_numbers.Real, _numbers.Inexact): if context is None: context = getcontext() - if context._rounding_decision == ALWAYS_ROUND: - return ans._fix(context) - return ans + return ans._fix(context) def __pos__(self, context=None): """Returns a copy, unless it is a sNaN. @@ -954,26 +948,23 @@ class Decimal(_numbers.Real, _numbers.Inexact): if context is None: context = getcontext() - if context._rounding_decision == ALWAYS_ROUND: - return ans._fix(context) - return ans + return ans._fix(context) - def __abs__(self, round=1, context=None): + def __abs__(self, round=True, context=None): """Returns the absolute value of self. - If the second argument is 0, do not round. + If the keyword argument 'round' is false, do not round. The + expression self.__abs__(round=False) is equivalent to + self.copy_abs(). """ + if not round: + return self.copy_abs() + if self._is_special: ans = self._check_nans(context=context) if ans: return ans - if not round: - if context is None: - context = getcontext() - context = context._shallow_copy() - context._set_rounding_decision(NEVER_ROUND) - if self._sign: ans = self.__neg__(context=context) else: @@ -1006,8 +997,6 @@ class Decimal(_numbers.Real, _numbers.Inexact): if other._isinfinity(): return Decimal(other) # Can't both be infinity here - shouldround = context._rounding_decision == ALWAYS_ROUND - exp = min(self._exp, other._exp) negativezero = 0 if context.rounding == ROUND_FLOOR and self._sign != other._sign: @@ -1019,33 +1008,29 @@ class Decimal(_numbers.Real, _numbers.Inexact): if negativezero: sign = 1 ans = _dec_from_triple(sign, '0', exp) - if shouldround: - ans = ans._fix(context) + ans = ans._fix(context) return ans if not self: exp = max(exp, other._exp - context.prec-1) ans = other._rescale(exp, context.rounding) - if shouldround: - ans = ans._fix(context) + ans = ans._fix(context) return ans if not other: exp = max(exp, self._exp - context.prec-1) ans = self._rescale(exp, context.rounding) - if shouldround: - ans = ans._fix(context) + ans = ans._fix(context) return ans op1 = _WorkRep(self) op2 = _WorkRep(other) - op1, op2 = _normalize(op1, op2, shouldround, context.prec) + op1, op2 = _normalize(op1, op2, context.prec) result = _WorkRep() if op1.sign != op2.sign: # Equal and opposite if op1.int == op2.int: ans = _dec_from_triple(negativezero, '0', exp) - if shouldround: - ans = ans._fix(context) + ans = ans._fix(context) return ans if op1.int < op2.int: op1, op2 = op2, op1 @@ -1070,8 +1055,7 @@ class Decimal(_numbers.Real, _numbers.Inexact): result.exp = op1.exp ans = Decimal(result) - if shouldround: - ans = ans._fix(context) + ans = ans._fix(context) return ans __radd__ = __add__ @@ -1128,34 +1112,29 @@ class Decimal(_numbers.Real, _numbers.Inexact): return Infsign[resultsign] resultexp = self._exp + other._exp - shouldround = context._rounding_decision == ALWAYS_ROUND # Special case for multiplying by zero if not self or not other: ans = _dec_from_triple(resultsign, '0', resultexp) - if shouldround: - # Fixing in case the exponent is out of bounds - ans = ans._fix(context) + # Fixing in case the exponent is out of bounds + ans = ans._fix(context) return ans # Special case for multiplying by power of 10 if self._int == '1': ans = _dec_from_triple(resultsign, other._int, resultexp) - if shouldround: - ans = ans._fix(context) + ans = ans._fix(context) return ans if other._int == '1': ans = _dec_from_triple(resultsign, self._int, resultexp) - if shouldround: - ans = ans._fix(context) + ans = ans._fix(context) return ans op1 = _WorkRep(self) op2 = _WorkRep(other) ans = _dec_from_triple(resultsign, str(op1.int * op2.int), resultexp) - if shouldround: - ans = ans._fix(context) + ans = ans._fix(context) return ans __rmul__ = __mul__ @@ -1292,8 +1271,7 @@ class Decimal(_numbers.Real, _numbers.Inexact): context._raise_error(InvalidOperation, 'x % 0')) quotient, remainder = self._divide(other, context) - if context._rounding_decision == ALWAYS_ROUND: - remainder = remainder._fix(context) + remainder = remainder._fix(context) return quotient, remainder def __rdivmod__(self, other, context=None): @@ -1327,8 +1305,7 @@ class Decimal(_numbers.Real, _numbers.Inexact): return context._raise_error(DivisionUndefined, '0 % 0') remainder = self._divide(other, context)[1] - if context._rounding_decision == ALWAYS_ROUND: - remainder = remainder._fix(context) + remainder = remainder._fix(context) return remainder def __rmod__(self, other, context=None): @@ -2498,9 +2475,7 @@ class Decimal(_numbers.Real, _numbers.Inexact): else: ans = self - if context._rounding_decision == ALWAYS_ROUND: - return ans._fix(context) - return ans + return ans._fix(context) def min(self, other, context=None): """Returns the smaller value. @@ -2534,9 +2509,7 @@ class Decimal(_numbers.Real, _numbers.Inexact): else: ans = other - if context._rounding_decision == ALWAYS_ROUND: - return ans._fix(context) - return ans + return ans._fix(context) def _isinteger(self): """Returns whether self is an integer""" @@ -3107,9 +3080,7 @@ class Decimal(_numbers.Real, _numbers.Inexact): else: ans = self - if context._rounding_decision == ALWAYS_ROUND: - return ans._fix(context) - return ans + return ans._fix(context) def min_mag(self, other, context=None): """Compares the values numerically with their sign ignored.""" @@ -3139,9 +3110,7 @@ class Decimal(_numbers.Real, _numbers.Inexact): else: ans = other - if context._rounding_decision == ALWAYS_ROUND: - return ans._fix(context) - return ans + return ans._fix(context) def next_minus(self, context=None): """Returns the largest representable number smaller than itself.""" @@ -3434,7 +3403,6 @@ class Context(object): Contains: prec - precision (for use in rounding, division, square roots..) rounding - rounding type (how you round) - _rounding_decision - ALWAYS_ROUND, NEVER_ROUND -- do you round? traps - If traps[exception] = 1, then the exception is raised when it is caused. Otherwise, a value is substituted in. @@ -3450,7 +3418,6 @@ class Context(object): def __init__(self, prec=None, rounding=None, traps=None, flags=None, - _rounding_decision=None, Emin=None, Emax=None, capitals=None, _clamp=0, _ignored_flags=None): @@ -3488,16 +3455,16 @@ class Context(object): def _shallow_copy(self): """Returns a shallow copy from self.""" - nc = Context(self.prec, self.rounding, self.traps, self.flags, - self._rounding_decision, self.Emin, self.Emax, - self.capitals, self._clamp, self._ignored_flags) + nc = Context(self.prec, self.rounding, self.traps, + self.flags, self.Emin, self.Emax, + self.capitals, self._clamp, self._ignored_flags) return nc def copy(self): """Returns a deep copy from self.""" nc = Context(self.prec, self.rounding, self.traps.copy(), - self.flags.copy(), self._rounding_decision, self.Emin, - self.Emax, self.capitals, self._clamp, self._ignored_flags) + self.flags.copy(), self.Emin, self.Emax, + self.capitals, self._clamp, self._ignored_flags) return nc __copy__ = copy @@ -3554,27 +3521,6 @@ class Context(object): """Returns maximum exponent (= Emax - prec + 1)""" return int(self.Emax - self.prec + 1) - def _set_rounding_decision(self, type): - """Sets the rounding decision. - - Sets the rounding decision, and returns the current (previous) - rounding decision. Often used like: - - context = context._shallow_copy() - # That so you don't change the calling context - # if an error occurs in the middle (say DivisionImpossible is raised). - - rounding = context._set_rounding_decision(NEVER_ROUND) - instance = instance / Decimal(2) - context._set_rounding_decision(rounding) - - This will make it not round for that operation. - """ - - rounding = self._rounding_decision - self._rounding_decision = type - return rounding - def _set_rounding(self, type): """Sets the rounding type. @@ -4762,7 +4708,7 @@ class _WorkRep(object): -def _normalize(op1, op2, shouldround = 0, prec = 0): +def _normalize(op1, op2, prec = 0): """Normalizes op1, op2 to have the same exp and length of coefficient. Done during addition. @@ -4779,13 +4725,12 @@ def _normalize(op1, op2, shouldround = 0, prec = 0): # as adding any positive quantity smaller than 10**exp; similarly # for subtraction. So if other is smaller than 10**exp we replace # it with 10**exp. This avoids tmp.exp - other.exp getting too large. - if shouldround: - tmp_len = len(str(tmp.int)) - other_len = len(str(other.int)) - exp = tmp.exp + min(-1, tmp_len - prec - 2) - if other_len + other.exp - 1 < exp: - other.int = 1 - other.exp = exp + tmp_len = len(str(tmp.int)) + other_len = len(str(other.int)) + exp = tmp.exp + min(-1, tmp_len - prec - 2) + if other_len + other.exp - 1 < exp: + other.int = 1 + other.exp = exp tmp.int *= 10 ** (tmp.exp - other.exp) tmp.exp = other.exp @@ -5153,7 +5098,6 @@ DefaultContext = Context( prec=28, rounding=ROUND_HALF_EVEN, traps=[DivisionByZero, Overflow, InvalidOperation], flags=[], - _rounding_decision=ALWAYS_ROUND, Emax=999999999, Emin=-999999999, capitals=1 diff --git a/Lib/test/output/test_pep277 b/Lib/test/output/test_pep277 deleted file mode 100644 index 44a70ec..0000000 --- a/Lib/test/output/test_pep277 +++ /dev/null @@ -1,3 +0,0 @@ -test_pep277 -'\xdf-\u66e8\u66e9\u66eb' -['Gr\xfc\xdf-Gott', 'abc', 'ascii', '\u0393\u03b5\u03b9\u03ac-\u03c3\u03b1\u03c2', '\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435', '\u05d4\u05e9\u05e7\u05e6\u05e5\u05e1', '\u306b\u307d\u3093', '\u66e8\u05e9\u3093\u0434\u0393\xdf', '\u66e8\u66e9\u66eb'] diff --git a/Lib/test/test_pep277.py b/Lib/test/test_pep277.py index 554e011..3c3f9ac 100644 --- a/Lib/test/test_pep277.py +++ b/Lib/test/test_pep277.py @@ -78,12 +78,12 @@ class UnicodeFileTests(unittest.TestCase): def test_listdir(self): f1 = os.listdir(test_support.TESTFN) - # Printing f1 is not appropriate, as specific filenames - # returned depend on the local encoding f2 = os.listdir(str(test_support.TESTFN.encode("utf-8"), sys.getfilesystemencoding())) - f2.sort() - print(f2) + sf2 = set("\\".join((unicode(test_support.TESTFN), f)) + for f in f2) + self.failUnlessEqual(len(f1), len(self.files)) + self.failUnlessEqual(sf2, set(self.files)) def test_rename(self): for name in self.files: @@ -99,7 +99,6 @@ class UnicodeFileTests(unittest.TestCase): f = open(filename, 'wb') f.write((filename + '\n').encode("utf-8")) f.close() - print(repr(filename)) os.access(filename,os.R_OK) os.remove(filename) os.chdir(oldwd) diff --git a/Objects/listobject.c b/Objects/listobject.c index efcedc7..9fbc463 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -2177,7 +2177,7 @@ PyObject * PyList_AsTuple(PyObject *v) { PyObject *w; - PyObject **p; + PyObject **p, **q; Py_ssize_t n; if (v == NULL || !PyList_Check(v)) { PyErr_BadInternalCall(); @@ -2188,12 +2188,12 @@ PyList_AsTuple(PyObject *v) if (w == NULL) return NULL; p = ((PyTupleObject *)w)->ob_item; - memcpy((void *)p, - (void *)((PyListObject *)v)->ob_item, - n*sizeof(PyObject *)); + q = ((PyListObject *)v)->ob_item; while (--n >= 0) { - Py_INCREF(*p); + Py_INCREF(*q); + *p = *q; p++; + q++; } return w; } @@ -23389,9 +23389,9 @@ cat >>conftest.$ac_ext <<_ACEOF #include <stddef.h> #include <string.h> -int main() -{ - char buffer[256]; +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif #ifdef HAVE_SSIZE_T typedef ssize_t Py_ssize_t; @@ -23401,6 +23401,10 @@ typedef long Py_ssize_t; typedef int Py_ssize_t; #endif +int main() +{ + char buffer[256]; + if(sprintf(buffer, "%zd", (size_t)123) < 0) return 1; diff --git a/configure.in b/configure.in index c6eabad..915599d 100644 --- a/configure.in +++ b/configure.in @@ -3429,9 +3429,9 @@ AC_TRY_RUN([#include <stdio.h> #include <stddef.h> #include <string.h> -int main() -{ - char buffer[256]; +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif #ifdef HAVE_SSIZE_T typedef ssize_t Py_ssize_t; @@ -3441,6 +3441,10 @@ typedef long Py_ssize_t; typedef int Py_ssize_t; #endif +int main() +{ + char buffer[256]; + if(sprintf(buffer, "%zd", (size_t)123) < 0) return 1; |