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.
........
This commit is contained in:
Georg Brandl 2009-05-26 09:04:23 +00:00
parent 6415f07c2e
commit e081eef126
24 changed files with 250 additions and 80 deletions

View File

@ -7,8 +7,8 @@ These documents are generated from `reStructuredText
<http://docutils.sf.net/rst.html>`_ 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:
<http://effbot.org/zone/pyref.htm>`_ 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

View File

@ -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.

View File

@ -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):

View File

@ -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()
>>>

View File

@ -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,))

View File

@ -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.
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'``.
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

View File

@ -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 "<stdin>", 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

View File

@ -1,3 +1,5 @@
.. _email-examples:
:mod:`email`: Examples
----------------------

View File

@ -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'

View File

@ -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)

View File

@ -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 <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>` 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)

View File

@ -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:

View File

@ -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`.

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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::

View File

@ -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 "<stdin>", 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 "<stdin>", line 1, in ?
__main__.MyError: 'oops!'

View File

@ -285,11 +285,11 @@ position in the string results in an error::
>>> word[0] = 'x'
Traceback (most recent call last):
File "<stdin>", 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 "<stdin>", 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::

View File

@ -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

129
Lib/test/test_linecache.py Normal file
View File

@ -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()

View File

@ -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.