From e081eef126e86e8370d7e09a212e308b29d4adbc Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Tue, 26 May 2009 09:04:23 +0000 Subject: [PATCH] Merged revisions 72319-72320,72467,72661,72675-72679,72703,72708,72710,72712,72801-72802,72820,72822,72824,72826-72828,72830 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r72319 | georg.brandl | 2009-05-05 10:28:49 +0200 (Di, 05 Mai 2009) | 1 line #1309567: fix linecache behavior of stripping subdirectories from paths when looking for relative filename matches. Also add a linecache test suite. ........ r72320 | georg.brandl | 2009-05-05 10:30:28 +0200 (Di, 05 Mai 2009) | 1 line Add a news entry for r72319. ........ r72467 | georg.brandl | 2009-05-08 14:17:34 +0200 (Fr, 08 Mai 2009) | 1 line Fix name. ........ r72661 | georg.brandl | 2009-05-15 10:03:03 +0200 (Fr, 15 Mai 2009) | 1 line Fix example output for doctest-like demos. ........ r72675 | georg.brandl | 2009-05-16 13:13:21 +0200 (Sa, 16 Mai 2009) | 1 line #6034: clarify __reversed__ doc. ........ r72676 | georg.brandl | 2009-05-16 13:14:46 +0200 (Sa, 16 Mai 2009) | 1 line #6025: fix signature of parse(). ........ r72677 | georg.brandl | 2009-05-16 13:18:55 +0200 (Sa, 16 Mai 2009) | 1 line #6009: undocument default argument of Option as deprecated. ........ r72678 | georg.brandl | 2009-05-16 13:21:29 +0200 (Sa, 16 Mai 2009) | 1 line #2856: document 2.x os.listdir() behavior for undecodable filenames. ........ r72679 | georg.brandl | 2009-05-16 13:24:41 +0200 (Sa, 16 Mai 2009) | 1 line Fix about and bugs pages to match real workflow. ........ r72703 | georg.brandl | 2009-05-17 10:10:27 +0200 (So, 17 Mai 2009) | 1 line part of #4144: fix exception message in console session. ........ r72708 | georg.brandl | 2009-05-17 10:24:29 +0200 (So, 17 Mai 2009) | 1 line #6017: better document behavior of dictiterators when the dict is changed. ........ r72710 | georg.brandl | 2009-05-17 10:36:04 +0200 (So, 17 Mai 2009) | 1 line #5942: Copy over flag table from dbm.rst which is clearer. ........ r72712 | georg.brandl | 2009-05-17 10:55:00 +0200 (So, 17 Mai 2009) | 1 line #5935: mention that BROWSER is looked for in PATH. ........ r72801 | georg.brandl | 2009-05-20 20:31:14 +0200 (Mi, 20 Mai 2009) | 1 line #6055: refer to "sqlite3" consistently. ........ r72802 | georg.brandl | 2009-05-20 20:35:27 +0200 (Mi, 20 Mai 2009) | 1 line #6051: refer to email examples for better way to construct email messages. ........ r72820 | georg.brandl | 2009-05-22 09:23:32 +0200 (Fr, 22 Mai 2009) | 1 line Use raise X(y). ........ r72822 | georg.brandl | 2009-05-22 11:33:25 +0200 (Fr, 22 Mai 2009) | 1 line #6084: fix example. ........ r72824 | georg.brandl | 2009-05-22 11:43:17 +0200 (Fr, 22 Mai 2009) | 1 line Fix references to file-related functions and methods (os.* vs file.*). ........ r72826 | georg.brandl | 2009-05-22 11:49:42 +0200 (Fr, 22 Mai 2009) | 1 line Fix confusing wording. ........ r72827 | georg.brandl | 2009-05-22 11:50:30 +0200 (Fr, 22 Mai 2009) | 1 line s/use/call/ ........ r72828 | georg.brandl | 2009-05-22 11:58:48 +0200 (Fr, 22 Mai 2009) | 1 line Correction in softspace behavior description. ........ r72830 | georg.brandl | 2009-05-22 12:40:00 +0200 (Fr, 22 Mai 2009) | 1 line #6086: fix spelling and use a better exception to catch. ........ --- Doc/about.rst | 7 +- Doc/bugs.rst | 3 + Doc/howto/doanddont.rst | 10 +-- Doc/howto/urllib2.rst | 2 +- Doc/includes/sqlite3/text_factory.py | 7 +- Doc/library/anydbm.rst | 36 +++++--- Doc/library/ctypes.rst | 12 +-- Doc/library/email-examples.rst | 2 + Doc/library/functions.rst | 4 +- Doc/library/optparse.rst | 4 +- Doc/library/os.rst | 33 +++---- Doc/library/shelve.rst | 3 +- Doc/library/smtplib.rst | 5 ++ Doc/library/sqlite3.rst | 22 ++--- Doc/library/stdtypes.rst | 7 +- Doc/library/webbrowser.rst | 7 +- Doc/library/xml.dom.minidom.rst | 2 +- Doc/reference/datamodel.rst | 10 +-- Doc/reference/simple_stmts.rst | 7 +- Doc/tutorial/errors.rst | 6 +- Doc/tutorial/introduction.rst | 4 +- Lib/linecache.py | 7 +- Lib/test/test_linecache.py | 129 +++++++++++++++++++++++++++ Misc/NEWS | 3 + 24 files changed, 251 insertions(+), 81 deletions(-) create mode 100644 Lib/test/test_linecache.py diff --git a/Doc/about.rst b/Doc/about.rst index a5adf07da8..9483ca5347 100644 --- a/Doc/about.rst +++ b/Doc/about.rst @@ -7,8 +7,8 @@ These documents are generated from `reStructuredText `_ sources by *Sphinx*, a document processor specifically written for the Python documentation. -In the online version of these documents, you can submit comments and suggest -changes directly on the documentation pages. +.. In the online version of these documents, you can submit comments and suggest + changes directly on the documentation pages. Development of the documentation and its toolchain takes place on the docs@python.org mailing list. We're always looking for volunteers wanting @@ -24,7 +24,8 @@ Many thanks go to: `_ project from which Sphinx got many good ideas. -See :ref:`reporting-bugs` for information how to report bugs in Python itself. +See :ref:`reporting-bugs` for information how to report bugs in this +documentation, or Python itself. .. including the ACKS file here so that it can be maintained separately .. include:: ACKS.txt diff --git a/Doc/bugs.rst b/Doc/bugs.rst index 9c6e524729..dc7d388bcc 100644 --- a/Doc/bugs.rst +++ b/Doc/bugs.rst @@ -19,6 +19,9 @@ the problem has already been fixed for the next release, or additional information is needed (in which case you are welcome to provide it if you can!). To do this, search the bug database using the search box on the top of the page. +In the case of documentation bugs, look at the most recent development docs at +http://docs.python.org/dev to see if the bug has been fixed. + If the problem you're reporting is not already in the bug tracker, go back to the Python Bug Tracker. If you don't already have a tracker account, select the "Register" link in the sidebar and undergo the registration procedure. diff --git a/Doc/howto/doanddont.rst b/Doc/howto/doanddont.rst index a56fb8c13e..eee576596f 100644 --- a/Doc/howto/doanddont.rst +++ b/Doc/howto/doanddont.rst @@ -30,7 +30,7 @@ Inside Function Definitions ``from module import *`` is *invalid* inside function definitions. While many versions of Python do not check for the invalidity, it does not make it more -valid, no more then having a smart lawyer makes a man innocent. Do not use it +valid, no more than having a smart lawyer makes a man innocent. Do not use it like that ever. Even in versions where it was accepted, it made the function execution slower, because the compiler could not be certain which names are local and which are global. In Python 2.1 this construct causes warnings, and @@ -111,7 +111,7 @@ Good examples:: from module import name1, name2 ------------------------------- -This is a "don't" which is much weaker then the previous "don't"s but is still +This is a "don't" which is much weaker than the previous "don't"s but is still something you should not do if you don't have good reasons to do that. The reason it is usually bad idea is because you suddenly have an object which lives in two separate namespaces. When the binding in one namespace changes, the @@ -245,11 +245,11 @@ Using the Batteries Every so often, people seem to be writing stuff in the Python library again, usually poorly. While the occasional module has a poor interface, it is usually much better to use the rich standard library and data types that come with -Python then inventing your own. +Python than inventing your own. A useful module very few people know about is :mod:`os.path`. It always has the correct path arithmetic for your operating system, and will usually be much -better then whatever you come up with yourself. +better than whatever you come up with yourself. Compare:: @@ -284,7 +284,7 @@ Using Backslash to Continue Statements ====================================== Since Python treats a newline as a statement terminator, and since statements -are often more then is comfortable to put in one line, many people do:: +are often more than is comfortable to put in one line, many people do:: if foo.bar()['first'][0] == baz.quux(1, 2)[5:9] and \ calculate_number(10, 20) != forbulate(500, 360): diff --git a/Doc/howto/urllib2.rst b/Doc/howto/urllib2.rst index 96f2ce2045..629c38d8f6 100644 --- a/Doc/howto/urllib2.rst +++ b/Doc/howto/urllib2.rst @@ -311,7 +311,7 @@ geturl, and info, methods. :: >>> req = urllib2.Request('http://www.python.org/fish.html') >>> try: >>> urllib2.urlopen(req) - >>> except URLError, e: + >>> except HTTPError, e: >>> print e.code >>> print e.read() >>> diff --git a/Doc/includes/sqlite3/text_factory.py b/Doc/includes/sqlite3/text_factory.py index 3e157a8ea9..94a59da4b7 100644 --- a/Doc/includes/sqlite3/text_factory.py +++ b/Doc/includes/sqlite3/text_factory.py @@ -13,7 +13,7 @@ cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() assert row[0] == AUSTRIA -# but we can make pysqlite always return bytestrings ... +# but we can make sqlite3 always return bytestrings ... con.text_factory = str cur.execute("select ?", (AUSTRIA,)) row = cur.fetchone() @@ -26,11 +26,12 @@ assert row[0] == AUSTRIA.encode("utf-8") # here we implement one that will ignore Unicode characters that cannot be # decoded from UTF-8 con.text_factory = lambda x: unicode(x, "utf-8", "ignore") -cur.execute("select ?", ("this is latin1 and would normally create errors" + u"\xe4\xf6\xfc".encode("latin1"),)) +cur.execute("select ?", ("this is latin1 and would normally create errors" + + u"\xe4\xf6\xfc".encode("latin1"),)) row = cur.fetchone() assert type(row[0]) == unicode -# pysqlite offers a builtin optimized text_factory that will return bytestring +# sqlite3 offers a builtin optimized text_factory that will return bytestring # objects, if the data is in ASCII only, and otherwise return unicode objects con.text_factory = sqlite3.OptimizedUnicode cur.execute("select ?", (AUSTRIA,)) diff --git a/Doc/library/anydbm.rst b/Doc/library/anydbm.rst index 36f0a7e6be..aad17764e3 100644 --- a/Doc/library/anydbm.rst +++ b/Doc/library/anydbm.rst @@ -27,19 +27,33 @@ these modules is installed, the slow-but-simple implementation in module Open the database file *filename* and return a corresponding object. - If the database file already exists, the :mod:`whichdb` module is used to - determine its type and the appropriate module is used; if it does not exist, the - first module listed above that can be imported is used. - - The optional *flag* argument can be ``'r'`` to open an existing database for - reading only, ``'w'`` to open an existing database for reading and writing, - ``'c'`` to create the database if it doesn't exist, or ``'n'``, which will - always create a new empty database. If not specified, the default value is - ``'r'``. + If the database file already exists, the :mod:`whichdb` module is used to + determine its type and the appropriate module is used; if it does not exist, + the first module listed above that can be imported is used. + + The optional *flag* argument must be one of these values: + + +---------+-------------------------------------------+ + | Value | Meaning | + +=========+===========================================+ + | ``'r'`` | Open existing database for reading only | + | | (default) | + +---------+-------------------------------------------+ + | ``'w'`` | Open existing database for reading and | + | | writing | + +---------+-------------------------------------------+ + | ``'c'`` | Open database for reading and writing, | + | | creating it if it doesn't exist | + +---------+-------------------------------------------+ + | ``'n'`` | Always create a new, empty database, open | + | | for reading and writing | + +---------+-------------------------------------------+ + + If not specified, the default value is ``'r'``. The optional *mode* argument is the Unix mode of the file, used only when the - database has to be created. It defaults to octal ``0666`` (and will be modified - by the prevailing umask). + database has to be created. It defaults to octal ``0666`` (and will be + modified by the prevailing umask). .. exception:: error diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst index c7c3b008bd..5da4c9d22e 100644 --- a/Doc/library/ctypes.rst +++ b/Doc/library/ctypes.rst @@ -341,9 +341,9 @@ within *IDLE* or *PythonWin*:: >>> printf("Hello, %s\n", "World!") Hello, World! 14 - >>> printf("Hello, %S", u"World!") + >>> printf("Hello, %S\n", u"World!") Hello, World! - 13 + 14 >>> printf("%d bottles of beer\n", 42) 42 bottles of beer 19 @@ -358,7 +358,7 @@ unicode strings have to be wrapped in their corresponding ``ctypes`` type, so that they can be converted to the required C data type:: >>> printf("An int %d, a double %f\n", 1234, c_double(3.14)) - Integer 1234, double 3.1400001049 + An int 1234, a double 3.140000 31 >>> @@ -414,9 +414,9 @@ prototype for a C function), and tries to convert the arguments to valid types:: Traceback (most recent call last): File "", line 1, in ? ArgumentError: argument 2: exceptions.TypeError: wrong type - >>> printf("%s %d %f", "X", 2, 3) - X 2 3.00000012 - 12 + >>> printf("%s %d %f\n", "X", 2, 3) + X 2 3.000000 + 13 >>> If you have defined your own classes which you pass to function calls, you have diff --git a/Doc/library/email-examples.rst b/Doc/library/email-examples.rst index f606f9bb3b..c1b16da394 100644 --- a/Doc/library/email-examples.rst +++ b/Doc/library/email-examples.rst @@ -1,3 +1,5 @@ +.. _email-examples: + :mod:`email`: Examples ---------------------- diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst index b989e8ebfb..9764eae373 100644 --- a/Doc/library/functions.rst +++ b/Doc/library/functions.rst @@ -1398,7 +1398,7 @@ available. They are listed here in alphabetical order. >>> zipped [(1, 4), (2, 5), (3, 6)] >>> x2, y2 = zip(*zipped) - >>> x == x2, y == y2 + >>> x == list(x2) and y == list(y2) True .. versionadded:: 2.0 @@ -1468,7 +1468,7 @@ available. They are listed here in alphabetical order. names. If you simply want to import a module (potentially within a package) by name, - you can get it from :data:`sys.modules`:: + you can call :func:`__import__` and then look it up in :data:`sys.modules`:: >>> import sys >>> name = 'foo.bar.baz' diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst index 4ef2ba7eb8..a07a7512e4 100644 --- a/Doc/library/optparse.rst +++ b/Doc/library/optparse.rst @@ -1077,10 +1077,10 @@ to a particular option, or fail to pass a required option attribute, tells :mod:`optparse` where to write it: :attr:`dest` names an attribute of the ``options`` object that :mod:`optparse` builds as it parses the command line. -* ``default`` (deprecated) +* ``default`` The value to use for this option's destination if the option is not seen on the - command line. Deprecated; use ``parser.set_defaults()`` instead. + command line. See also ``parser.set_defaults()``. * ``nargs`` (default: 1) diff --git a/Doc/library/os.rst b/Doc/library/os.rst index 4d8fc4c3f9..357b37eaf1 100644 --- a/Doc/library/os.rst +++ b/Doc/library/os.rst @@ -354,7 +354,7 @@ These functions create new file objects. (See also :func:`open`.) is ``'r'`` (default) or ``'w'``. The *bufsize* argument has the same meaning as the corresponding argument to the built-in :func:`open` function. The exit status of the command (encoded in the format specified for :func:`wait`) is - available as the return value of the :meth:`close` method of the file object, + available as the return value of the :meth:`~file.close` method of the file object, except that when the exit status is zero (termination without errors), ``None`` is returned. Availability: Unix, Windows. @@ -475,9 +475,9 @@ by file descriptors. .. note:: This function is intended for low-level I/O and must be applied to a file - descriptor as returned by :func:`open` or :func:`pipe`. To close a "file + descriptor as returned by :func:`os.open` or :func:`pipe`. To close a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, use its :meth:`close` method. + :func:`fdopen`, use its :meth:`~file.close` method. .. function:: closerange(fd_low, fd_high) @@ -604,8 +604,8 @@ by file descriptors. .. note:: This function is intended for low-level I/O. For normal usage, use the built-in - function :func:`open`, which returns a "file object" with :meth:`read` and - :meth:`write` methods (and many more). To wrap a file descriptor in a "file + function :func:`open`, which returns a "file object" with :meth:`~file.read` and + :meth:`~file.write` methods (and many more). To wrap a file descriptor in a "file object", use :func:`fdopen`. @@ -634,22 +634,22 @@ by file descriptors. .. note:: This function is intended for low-level I/O and must be applied to a file - descriptor as returned by :func:`open` or :func:`pipe`. To read a "file object" + descriptor as returned by :func:`os.open` or :func:`pipe`. To read a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`read` or :meth:`readline` - methods. + :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`~file.read` or + :meth:`~file.readline` methods. .. function:: tcgetpgrp(fd) Return the process group associated with the terminal given by *fd* (an open - file descriptor as returned by :func:`open`). Availability: Unix. + file descriptor as returned by :func:`os.open`). Availability: Unix. .. function:: tcsetpgrp(fd, pg) Set the process group associated with the terminal given by *fd* (an open file - descriptor as returned by :func:`open`) to *pg*. Availability: Unix. + descriptor as returned by :func:`os.open`) to *pg*. Availability: Unix. .. function:: ttyname(fd) @@ -667,13 +667,13 @@ by file descriptors. .. note:: This function is intended for low-level I/O and must be applied to a file - descriptor as returned by :func:`open` or :func:`pipe`. To write a "file + descriptor as returned by :func:`os.open` or :func:`pipe`. To write a "file object" returned by the built-in function :func:`open` or by :func:`popen` or - :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its :meth:`write` - method. + :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its + :meth:`~file.write` method. The following constants are options for the *flags* parameter to the -:func:`open` function. They can be combined using the bitwise OR operator +:func:`~os.open` function. They can be combined using the bitwise OR operator ``|``. Some of them are not available on all platforms. For descriptions of their availability and use, consult the :manpage:`open(2)` manual page on Unix or `the MSDN ` on Windows. @@ -752,7 +752,7 @@ Files and Directories .. note:: Using :func:`access` to check if a user is authorized to e.g. open a file before - actually doing so using :func:`open` creates a security hole, because the user + actually doing so using :func:`open` creates a security hole, because the user might exploit the short time interval between checking and opening the file to manipulate it. @@ -929,7 +929,8 @@ Files and Directories .. versionchanged:: 2.3 On Windows NT/2k/XP and Unix, if *path* is a Unicode object, the result will be - a list of Unicode objects. + a list of Unicode objects. Undecodable filenames will still be returned as + string objects. .. function:: lstat(path) diff --git a/Doc/library/shelve.rst b/Doc/library/shelve.rst index 56cb40710a..4e18ab155c 100644 --- a/Doc/library/shelve.rst +++ b/Doc/library/shelve.rst @@ -1,4 +1,3 @@ - :mod:`shelve` --- Python object persistence =========================================== @@ -40,7 +39,7 @@ lots of shared sub-objects. The keys are ordinary strings. entries are written back (there is no way to determine which accessed entries are mutable, nor which ones were actually mutated). -Shelve objects support all methods supported by dictionaries. This eases the +Shelf objects support all methods supported by dictionaries. This eases the transition from dictionary based scripts to those requiring persistent storage. One additional method is supported: diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst index 8facc9a6d8..4c1c614077 100644 --- a/Doc/library/smtplib.rst +++ b/Doc/library/smtplib.rst @@ -380,3 +380,8 @@ example doesn't do any processing of the :rfc:`822` headers. In particular, the server.sendmail(fromaddr, toaddrs, msg) server.quit() +.. note:: + + In general, you will want to use the :mod:`email` package's features to + construct an email message, which you can then convert to a string and send + via :meth:`sendmail`; see :ref:`email-examples`. diff --git a/Doc/library/sqlite3.rst b/Doc/library/sqlite3.rst index d031c90975..392a130abf 100644 --- a/Doc/library/sqlite3.rst +++ b/Doc/library/sqlite3.rst @@ -15,7 +15,7 @@ SQLite for internal data storage. It's also possible to prototype an application using SQLite and then port the code to a larger database such as PostgreSQL or Oracle. -pysqlite was written by Gerhard Häring and provides a SQL interface compliant +sqlite3 was written by Gerhard Häring and provides a SQL interface compliant with the DB-API 2.0 specification described by :pep:`249`. To use the module, you must first create a :class:`Connection` object that @@ -52,8 +52,9 @@ is insecure; it makes your program vulnerable to an SQL injection attack. Instead, use the DB-API's parameter substitution. Put ``?`` as a placeholder wherever you want to use a value, and then provide a tuple of values as the -second argument to the cursor's :meth:`~Cursor.execute` method. (Other database modules -may use a different placeholder, such as ``%s`` or ``:1``.) For example:: +second argument to the cursor's :meth:`~Cursor.execute` method. (Other database +modules may use a different placeholder, such as ``%s`` or ``:1``.) For +example:: # Never do this -- insecure! symbol = 'IBM' @@ -92,11 +93,12 @@ This example uses the iterator form:: .. seealso:: http://www.pysqlite.org - The pysqlite web page. + The pysqlite web page -- sqlite3 is developed externally under the name + "pysqlite". http://www.sqlite.org - The SQLite web page; the documentation describes the syntax and the available - data types for the supported SQL dialect. + The SQLite web page; the documentation describes the syntax and the + available data types for the supported SQL dialect. :pep:`249` - Database API Specification 2.0 PEP written by Marc-André Lemburg. @@ -802,10 +804,10 @@ So if you are within a transaction and issue a command like ``CREATE TABLE ...``, ``VACUUM``, ``PRAGMA``, the :mod:`sqlite3` module will commit implicitly before executing that command. There are two reasons for doing that. The first is that some of these commands don't work within transactions. The other reason -is that pysqlite needs to keep track of the transaction state (if a transaction +is that sqlite3 needs to keep track of the transaction state (if a transaction is active or not). -You can control which kind of ``BEGIN`` statements pysqlite implicitly executes +You can control which kind of ``BEGIN`` statements sqlite3 implicitly executes (or none at all) via the *isolation_level* parameter to the :func:`connect` call, or via the :attr:`isolation_level` property of connections. @@ -817,8 +819,8 @@ statement, or set it to one of SQLite's supported isolation levels: "DEFERRED", -Using pysqlite efficiently --------------------------- +Using :mod:`sqlite3` efficiently +-------------------------------- Using shortcut methods diff --git a/Doc/library/stdtypes.rst b/Doc/library/stdtypes.rst index 56b63128cd..7013f150d5 100644 --- a/Doc/library/stdtypes.rst +++ b/Doc/library/stdtypes.rst @@ -1955,7 +1955,7 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: note for :meth:`dict.items`. Using :meth:`iteritems` while adding or deleting entries in the dictionary - will raise a :exc:`RuntimeError`. + may raise a :exc:`RuntimeError` or fail to iterate over all entries. .. versionadded:: 2.2 @@ -1965,7 +1965,7 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: :meth:`dict.items`. Using :meth:`iterkeys` while adding or deleting entries in the dictionary - will raise a :exc:`RuntimeError`. + may raise a :exc:`RuntimeError` or fail to iterate over all entries. .. versionadded:: 2.2 @@ -1975,7 +1975,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: :meth:`dict.items`. Using :meth:`itervalues` while adding or deleting entries in the - dictionary will raise a :exc:`RuntimeError`. + dictionary may raise a :exc:`RuntimeError` or fail to iterate over all + entries. .. versionadded:: 2.2 diff --git a/Doc/library/webbrowser.rst b/Doc/library/webbrowser.rst index 56aba5a038..fc0a004dae 100644 --- a/Doc/library/webbrowser.rst +++ b/Doc/library/webbrowser.rst @@ -22,7 +22,7 @@ override the platform default list of browsers, as a os.pathsep-separated list of browsers to try in order. When the value of a list part contains the string ``%s``, then it is interpreted as a literal browser command line to be used with the argument URL substituted for ``%s``; if the part does not contain -``%s``, it is simply interpreted as the name of the browser to launch. +``%s``, it is simply interpreted as the name of the browser to launch. [1]_ For non-Unix platforms, or when a remote browser is available on Unix, the controlling process will not wait for the user to finish with the browser, but @@ -201,3 +201,8 @@ convenience functions: .. versionadded:: 2.5 + +.. rubric:: Footnotes + +.. [1] Executables named here without a full path will be searched in the + directories given in the :envvar:`PATH` environment variable. diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst index b127f0468e..cb49c023fa 100644 --- a/Doc/library/xml.dom.minidom.rst +++ b/Doc/library/xml.dom.minidom.rst @@ -30,7 +30,7 @@ DOM applications typically start by parsing some XML into a DOM. With The :func:`parse` function can take either a filename or an open file object. -.. function:: parse(filename_or_file, parser) +.. function:: parse(filename_or_file[, parser[, bufsize]]) Return a :class:`Document` from the given input. *filename_or_file* may be either a file name, or a file-like object. *parser*, if given, must be a SAX2 diff --git a/Doc/reference/datamodel.rst b/Doc/reference/datamodel.rst index 7d5b7beff8..ea0f869213 100644 --- a/Doc/reference/datamodel.rst +++ b/Doc/reference/datamodel.rst @@ -1858,11 +1858,11 @@ sequences, it should iterate through the values. reverse iteration. It should return a new iterator object that iterates over all the objects in the container in reverse order. - If the :meth:`__reversed__` method is not provided, the - :func:`reversed` builtin will fall back to using the sequence protocol - (:meth:`__len__` and :meth:`__getitem__`). Objects should normally - only provide :meth:`__reversed__` if they do not support the sequence - protocol and an efficient implementation of reverse iteration is possible. + If the :meth:`__reversed__` method is not provided, the :func:`reversed` + builtin will fall back to using the sequence protocol (:meth:`__len__` and + :meth:`__getitem__`). Objects that support the sequence protocol should + only provide :meth:`__reversed__` if they can provide an implementation + that is more efficient than the one provided by :func:`reversed`. .. versionadded:: 2.6 diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst index beb4623bf2..020c893f02 100644 --- a/Doc/reference/simple_stmts.rst +++ b/Doc/reference/simple_stmts.rst @@ -386,9 +386,10 @@ first converted to a string using the rules for string conversions. The object is (converted and) written, unless the output system believes it is positioned at the beginning of a line. This is the case (1) when no characters have yet been written to standard output, (2) when the last character written to -standard output is ``'\n'``, or (3) when the last write operation on standard -output was not a :keyword:`print` statement. (In some cases it may be -functional to write an empty string to standard output for this reason.) +standard output is a whitespace character except ``' '``, or (3) when the last +write operation on standard output was not a :keyword:`print` statement. +(In some cases it may be functional to write an empty string to standard output +for this reason.) .. note:: diff --git a/Doc/tutorial/errors.rst b/Doc/tutorial/errors.rst index e1d988ccd6..ebec952648 100644 --- a/Doc/tutorial/errors.rst +++ b/Doc/tutorial/errors.rst @@ -216,7 +216,7 @@ Raising Exceptions The :keyword:`raise` statement allows the programmer to force a specified exception to occur. For example:: - >>> raise NameError, 'HiThere' + >>> raise NameError('HiThere') Traceback (most recent call last): File "", line 1, in ? NameError: HiThere @@ -231,7 +231,7 @@ handle it, a simpler form of the :keyword:`raise` statement allows you to re-raise the exception:: >>> try: - ... raise NameError, 'HiThere' + ... raise NameError('HiThere') ... except NameError: ... print 'An exception flew by!' ... raise @@ -263,7 +263,7 @@ directly or indirectly. For example:: ... print 'My exception occurred, value:', e.value ... My exception occurred, value: 4 - >>> raise MyError, 'oops!' + >>> raise MyError('oops!') Traceback (most recent call last): File "", line 1, in ? __main__.MyError: 'oops!' diff --git a/Doc/tutorial/introduction.rst b/Doc/tutorial/introduction.rst index 21d3627657..23ff5229e9 100644 --- a/Doc/tutorial/introduction.rst +++ b/Doc/tutorial/introduction.rst @@ -285,11 +285,11 @@ position in the string results in an error:: >>> word[0] = 'x' Traceback (most recent call last): File "", line 1, in ? - TypeError: object doesn't support item assignment + TypeError: object does not support item assignment >>> word[:1] = 'Splat' Traceback (most recent call last): File "", line 1, in ? - TypeError: object doesn't support slice assignment + TypeError: object does not support slice assignment However, creating a new string with the combined content is easy and efficient:: diff --git a/Lib/linecache.py b/Lib/linecache.py index 48f7dda6e0..e7c33e1464 100644 --- a/Lib/linecache.py +++ b/Lib/linecache.py @@ -79,7 +79,7 @@ def updatecache(filename, module_globals=None): try: stat = os.stat(fullname) except os.error, msg: - basename = os.path.split(filename)[1] + basename = filename # Try for a __loader__, if available if module_globals and '__loader__' in module_globals: @@ -103,7 +103,10 @@ def updatecache(filename, module_globals=None): ) return cache[filename][2] - # Try looking through the module search path. + # Try looking through the module search path, which is only useful + # when handling a relative filename. + if os.path.isabs(filename): + return [] for dirname in sys.path: # When using imputil, sys.path may contain things other than diff --git a/Lib/test/test_linecache.py b/Lib/test/test_linecache.py new file mode 100644 index 0000000000..2894bb412b --- /dev/null +++ b/Lib/test/test_linecache.py @@ -0,0 +1,129 @@ +""" Tests for the linecache module """ + +import linecache +import unittest +import os.path +from test import test_support as support + + +FILENAME = linecache.__file__ +INVALID_NAME = '!@$)(!@#_1' +EMPTY = '' +TESTS = 'cjkencodings_test inspect_fodder inspect_fodder2 mapping_tests' +TESTS = TESTS.split() +TEST_PATH = os.path.dirname(support.__file__) +MODULES = "linecache unittest".split() +MODULE_PATH = os.path.dirname(FILENAME) + +SOURCE_1 = ''' +" Docstring " + +def function(): + return result + +''' + +SOURCE_2 = ''' +def f(): + return 1 + 1 + +a = f() + +''' + +class LineCacheTests(unittest.TestCase): + + def test_getline(self): + getline = linecache.getline + + # Bad values for line number should return an empty string + self.assertEquals(getline(FILENAME, 2**15), EMPTY) + self.assertEquals(getline(FILENAME, -1), EMPTY) + + # Float values currently raise TypeError, should it? + self.assertRaises(TypeError, getline, FILENAME, 1.1) + + # Bad filenames should return an empty string + self.assertEquals(getline(EMPTY, 1), EMPTY) + self.assertEquals(getline(INVALID_NAME, 1), EMPTY) + + # Check whether lines correspond to those from file iteration + for entry in TESTS: + filename = os.path.join(TEST_PATH, entry) + '.py' + for index, line in enumerate(open(filename)): + self.assertEquals(line, getline(filename, index + 1)) + + # Check module loading + for entry in MODULES: + filename = os.path.join(MODULE_PATH, entry) + '.py' + for index, line in enumerate(open(filename)): + self.assertEquals(line, getline(filename, index + 1)) + + # Check that bogus data isn't returned (issue #1309567) + empty = linecache.getlines('a/b/c/__init__.py') + self.assertEquals(empty, []) + + def test_clearcache(self): + cached = [] + for entry in TESTS: + filename = os.path.join(TEST_PATH, entry) + '.py' + cached.append(filename) + linecache.getline(filename, 1) + + # Are all files cached? + cached_empty = [fn for fn in cached if fn not in linecache.cache] + self.assertEquals(cached_empty, []) + + # Can we clear the cache? + linecache.clearcache() + cached_empty = [fn for fn in cached if fn in linecache.cache] + self.assertEquals(cached_empty, []) + + def test_checkcache(self): + getline = linecache.getline + try: + # Create a source file and cache its contents + source_name = os.path.join(TEST_PATH, 'linecache_test.py') + source = open(source_name, 'w') + source.write(SOURCE_1) + source.close() + getline(source_name, 1) + + # Keep a copy of the old contents + source_list = [] + source = open(source_name) + for index, line in enumerate(source): + self.assertEquals(line, getline(source_name, index + 1)) + source_list.append(line) + source.close() + + source = open(source_name, 'w') + source.write(SOURCE_2) + source.close() + + # Try to update a bogus cache entry + linecache.checkcache('dummy') + + # Check that the cache matches the old contents + for index, line in enumerate(source_list): + self.assertEquals(line, getline(source_name, index + 1)) + + # Update the cache and check whether it matches the new source file + linecache.checkcache(source_name) + source = open(source_name) + for index, line in enumerate(source): + self.assertEquals(line, getline(source_name, index + 1)) + source_list.append(line) + source.close() + + finally: + try: + source.close() + finally: + support.unlink(source_name) + +def test_main(): + support.run_unittest(LineCacheTests) + +if __name__ == "__main__": + test_main() diff --git a/Misc/NEWS b/Misc/NEWS index 1c03d701df..6efa49d6bd 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -220,6 +220,9 @@ Library - Issue #6062: In distutils, fixed the package option of build_ext. Feedback and tests on pywin32 by Tim Golden. +- Issue #1309567: Fix linecache behavior of stripping subdirectories when + looking for files given by a relative filename. + - Issue #6046: Fixed the library extension when distutils build_ext is used inplace. Initial patch by Roumen Petrov. -- 2.50.1