diff --git a/Doc/library/2to3.rst b/Doc/library/2to3.rst index 27626e0e52b..40234ef6362 100644 --- a/Doc/library/2to3.rst +++ b/Doc/library/2to3.rst @@ -37,8 +37,8 @@ It can be converted to Python 3.x code via 2to3 on the command line:: A diff against the original source file is printed. 2to3 can also write the needed modifications right back to the source file. (Of course, a backup of the -original is also be made.) Writing the changes back is enabled with the -:option:`-w` flag:: +original is also be made unless :option:`-n` is also given.) Writing the +changes back is enabled with the :option:`-w` flag:: $ 2to3 -w example.py @@ -50,11 +50,10 @@ After transformation, :file:`example.py` looks like this:: name = input() greet(name) -Comments and and exact indentation are preserved throughout the translation -process. +Comments and exact indentation are preserved throughout the translation process. By default, 2to3 runs a set of predefined fixers. The :option:`-l` flag lists -all avaible fixers. An explicit set of fixers to run can be given with +all available fixers. An explicit set of fixers to run can be given with :option:`-f`. Likewise the :option:`-x` explicitly disables a fixer. The following example runs only the ``imports`` and ``has_key`` fixers:: @@ -64,7 +63,7 @@ This command runs every fixer except the ``apply`` fixer:: $ 2to3 -x apply example.py -Some fixers are *explicit*, meaning they aren't run be default and must be +Some fixers are *explicit*, meaning they aren't run by default and must be listed on the command line to be run. Here, in addition to the default fixers, the ``idioms`` fixer is run:: @@ -72,10 +71,10 @@ the ``idioms`` fixer is run:: Notice how passing ``all`` enables all default fixers. -Sometimes 2to3 will find will find a place in your source code that needs to be -changed, but 2to3 cannot fix automatically. In this case, 2to3 will print a -warning beneath the diff for a file. You should address the warning in order to -have compliant 3.x code. +Sometimes 2to3 will find a place in your source code that needs to be changed, +but 2to3 cannot fix automatically. In this case, 2to3 will print a warning +beneath the diff for a file. You should address the warning in order to have +compliant 3.x code. 2to3 can also refactor doctests. To enable this mode, use the :option:`-d` flag. Note that *only* doctests will be refactored. This also doesn't require @@ -89,7 +88,7 @@ When the :option:`-p` is passed, 2to3 treats ``print`` as a function instead of a statement. This is useful when ``from __future__ import print_function`` is being used. If this option is not given, the print fixer will surround print calls in an extra set of parentheses because it cannot differentiate between the -and print statement with parentheses (such as ``print ("a" + "b" + "c")``) and a +print statement with parentheses (such as ``print ("a" + "b" + "c")``) and a true function call. diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 49932136059..7fa9864f246 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1465,8 +1465,8 @@ Notes on using *__slots__* defined. As a result, subclasses will have a *__dict__* unless they also define *__slots__*. -* *__slots__* do not work for classes derived from "variable-length" built-in - types such as :class:`int`, :class:`str` and :class:`tuple`. +* Nonempty *__slots__* does not work for classes derived from "variable-length" + built-in types such as :class:`int`, :class:`str` and :class:`tuple`. * Any non-string iterable may be assigned to *__slots__*. Mappings may also be used; however, in the future, special meaning may be assigned to the values diff --git a/Lib/ast.py b/Lib/ast.py index 1b1b5f4b1a2..53130cf3c5f 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -26,6 +26,7 @@ :license: Python License. """ from _ast import * +from _ast import __version__ def parse(expr, filename='', mode='exec'): diff --git a/Lib/bdb.py b/Lib/bdb.py index 747e0929f0e..88088a51969 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -319,6 +319,8 @@ class Bdb: while t is not None: stack.append((t.tb_frame, t.tb_lineno)) t = t.tb_next + if f is None: + i = max(0, len(stack) - 1) return stack, i # diff --git a/Lib/inspect.py b/Lib/inspect.py index 2b0f96e0636..df1d4b645b7 100644 --- a/Lib/inspect.py +++ b/Lib/inspect.py @@ -826,7 +826,7 @@ def getargvalues(frame): 'varargs' and 'varkw' are the names of the * and ** arguments or None. 'locals' is the locals dictionary of the given frame.""" args, varargs, varkw = getargs(frame.f_code) - return args, varargs, varkw, frame.f_locals + return ArgInfo(args, varargs, varkw, frame.f_locals) def joinseq(seq): if len(seq) == 1: diff --git a/Lib/pdb.py b/Lib/pdb.py index bc0ec68b44b..e697dfab4ba 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1220,9 +1220,7 @@ def post_mortem(t=None): p = Pdb() p.reset() - while t.tb_next is not None: - t = t.tb_next - p.interaction(t.tb_frame, t) + p.interaction(None, t) def pm(): post_mortem(sys.last_traceback) @@ -1285,9 +1283,7 @@ def main(): print("Uncaught exception. Entering post mortem debugging") print("Running 'cont' or 'step' will restart the program") t = sys.exc_info()[2] - while t.tb_next is not None: - t = t.tb_next - pdb.interaction(t.tb_frame,t) + pdb.interaction(None, t) print("Post mortem debugger finished. The "+mainpyfile+" will be restarted") diff --git a/Lib/platform.py b/Lib/platform.py index 740983b2cf1..c898dd13675 100755 --- a/Lib/platform.py +++ b/Lib/platform.py @@ -266,24 +266,6 @@ def _parse_release_file(firstline): id = '' return '', version, id -def _test_parse_release_file(): - - for input, output in ( - # Examples of release file contents: - ('SuSE Linux 9.3 (x86-64)', ('SuSE Linux ', '9.3', 'x86-64')) - ('SUSE LINUX 10.1 (X86-64)', ('SUSE LINUX ', '10.1', 'X86-64')) - ('SUSE LINUX 10.1 (i586)', ('SUSE LINUX ', '10.1', 'i586')) - ('Fedora Core release 5 (Bordeaux)', ('Fedora Core', '5', 'Bordeaux')) - ('Red Hat Linux release 8.0 (Psyche)', ('Red Hat Linux', '8.0', 'Psyche')) - ('Red Hat Linux release 9 (Shrike)', ('Red Hat Linux', '9', 'Shrike')) - ('Red Hat Enterprise Linux release 4 (Nahant)', ('Red Hat Enterprise Linux', '4', 'Nahant')) - ('CentOS release 4', ('CentOS', '4', None)) - ('Rocks release 4.2.1 (Cydonia)', ('Rocks', '4.2.1', 'Cydonia')) - ): - parsed = _parse_release_file(input) - if parsed != output: - print((input, parsed)) - def linux_distribution(distname='', version='', id='', supported_dists=_supported_dists, @@ -1357,21 +1339,6 @@ def _sys_version(sys_version=None): _sys_version_cache[sys_version] = result return result -def _test_sys_version(): - - _sys_version_cache.clear() - for input, output in ( - ('2.4.3 (#1, Jun 21 2006, 13:54:21) \n[GCC 3.3.4 (pre 3.3.5 20040809)]', - ('CPython', '2.4.3', '', '', '1', 'Jun 21 2006 13:54:21', 'GCC 3.3.4 (pre 3.3.5 20040809)')), - ('IronPython 1.0.60816 on .NET 2.0.50727.42', - ('IronPython', '1.0.60816', '', '', '', '', '.NET 2.0.50727.42')), - ('IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42', - ('IronPython', '1.0.0', '', '', '', '', '.NET 2.0.50727.42')), - ): - parsed = _sys_version(input) - if parsed != output: - print((input, parsed)) - def python_implementation(): """ Returns a string identifying the Python implementation. diff --git a/Lib/test/test_platform.py b/Lib/test/test_platform.py index 4b4c0fa55ef..a18d48b1054 100644 --- a/Lib/test/test_platform.py +++ b/Lib/test/test_platform.py @@ -115,6 +115,40 @@ class PlatformTest(unittest.TestCase): executable = executable + '.exe' res = platform.libc_ver(sys.executable) + def test_parse_release_file(self): + + for input, output in ( + # Examples of release file contents: + ('SuSE Linux 9.3 (x86-64)', ('SuSE Linux ', '9.3', 'x86-64')), + ('SUSE LINUX 10.1 (X86-64)', ('SUSE LINUX ', '10.1', 'X86-64')), + ('SUSE LINUX 10.1 (i586)', ('SUSE LINUX ', '10.1', 'i586')), + ('Fedora Core release 5 (Bordeaux)', ('Fedora Core', '5', 'Bordeaux')), + ('Red Hat Linux release 8.0 (Psyche)', ('Red Hat Linux', '8.0', 'Psyche')), + ('Red Hat Linux release 9 (Shrike)', ('Red Hat Linux', '9', 'Shrike')), + ('Red Hat Enterprise Linux release 4 (Nahant)', ('Red Hat Enterprise Linux', '4', 'Nahant')), + ('CentOS release 4', ('CentOS', '4', None)), + ('Rocks release 4.2.1 (Cydonia)', ('Rocks', '4.2.1', 'Cydonia')), + ): + self.assertEqual(platform._parse_release_file(input), output) + + def test_sys_version(self): + + platform._sys_version_cache.clear() + for input, output in ( + ('2.4.3 (#1, Jun 21 2006, 13:54:21) \n[GCC 3.3.4 (pre 3.3.5 20040809)]', + ('CPython', '2.4.3', '', '', '1', 'Jun 21 2006 13:54:21', 'GCC 3.3.4 (pre 3.3.5 20040809)')), + ('IronPython 1.0.60816 on .NET 2.0.50727.42', + ('IronPython', '1.0.60816', '', '', '', '', '.NET 2.0.50727.42')), + ('IronPython 1.0 (1.0.61005.1977) on .NET 2.0.50727.42', + ('IronPython', '1.0.0', '', '', '', '', '.NET 2.0.50727.42')), + ): + # branch and revision are not "parsed", but fetched + # from sys.subversion. Ignore them + (name, version, branch, revision, buildno, builddate, compiler) \ + = platform._sys_version(input) + self.assertEqual( + (name, version, '', '', buildno, builddate, compiler), output) + def test_main(): support.run_unittest( PlatformTest diff --git a/Lib/test/test_urllib.py b/Lib/test/test_urllib.py index 857634762f6..65687323cf6 100644 --- a/Lib/test/test_urllib.py +++ b/Lib/test/test_urllib.py @@ -117,7 +117,6 @@ class urlopen_FileTests(unittest.TestCase): class ProxyTests(unittest.TestCase): def setUp(self): - unittest.TestCase.setUp(self) # Save all proxy related env vars self._saved_environ = dict([(k, v) for k, v in os.environ.items() if k.lower().find('proxy') >= 0]) @@ -126,9 +125,8 @@ class ProxyTests(unittest.TestCase): del os.environ[k] def tearDown(self): - unittest.TestCase.tearDown(self) # Restore all proxy related env vars - for k, v in self._saved_environ: + for k, v in self._saved_environ.items(): os.environ[k] = v def test_getproxies_environment_keep_no_proxies(self): diff --git a/Makefile.pre.in b/Makefile.pre.in index 2fcbdf7242d..0e157256936 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -796,7 +796,7 @@ maninstall: fi; \ done $(INSTALL_DATA) $(srcdir)/Misc/python.man \ - $(DESTDIR)$(MANDIR)/man1/python.1 + $(DESTDIR)$(MANDIR)/man1/python$(VERSION).1 # Install the library PLATDIR= plat-$(MACHDEP) diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 8c8ef820dc5..b98da204763 100755 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -804,7 +804,7 @@ static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) return 0; } -static int add_ast_fields() +static int add_ast_fields(void) { PyObject *empty_tuple, *d; if (PyType_Ready(&AST_type) < 0) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 725256350c3..a0f42d573f5 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -621,7 +621,7 @@ static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) return 0; } -static int add_ast_fields() +static int add_ast_fields(void) { PyObject *empty_tuple, *d; if (PyType_Ready(&AST_type) < 0)