Kaydet (Commit) e081eef1 authored tarafından Georg Brandl's avatar Georg Brandl

Merged revisions…

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.
........
üst 6415f07c
...@@ -7,8 +7,8 @@ These documents are generated from `reStructuredText ...@@ -7,8 +7,8 @@ These documents are generated from `reStructuredText
<http://docutils.sf.net/rst.html>`_ sources by *Sphinx*, a document processor <http://docutils.sf.net/rst.html>`_ sources by *Sphinx*, a document processor
specifically written for the Python documentation. specifically written for the Python documentation.
In the online version of these documents, you can submit comments and suggest .. In the online version of these documents, you can submit comments and suggest
changes directly on the documentation pages. changes directly on the documentation pages.
Development of the documentation and its toolchain takes place on the Development of the documentation and its toolchain takes place on the
docs@python.org mailing list. We're always looking for volunteers wanting docs@python.org mailing list. We're always looking for volunteers wanting
...@@ -24,7 +24,8 @@ Many thanks go to: ...@@ -24,7 +24,8 @@ Many thanks go to:
<http://effbot.org/zone/pyref.htm>`_ project from which Sphinx got many good <http://effbot.org/zone/pyref.htm>`_ project from which Sphinx got many good
ideas. 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 .. including the ACKS file here so that it can be maintained separately
.. include:: ACKS.txt .. include:: ACKS.txt
......
...@@ -19,6 +19,9 @@ the problem has already been fixed for the next release, or additional ...@@ -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!). 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. 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 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 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. "Register" link in the sidebar and undergo the registration procedure.
......
...@@ -30,7 +30,7 @@ Inside Function Definitions ...@@ -30,7 +30,7 @@ Inside Function Definitions
``from module import *`` is *invalid* inside function definitions. While many ``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 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 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 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 local and which are global. In Python 2.1 this construct causes warnings, and
...@@ -111,7 +111,7 @@ Good examples:: ...@@ -111,7 +111,7 @@ Good examples::
from module import name1, name2 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 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 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 in two separate namespaces. When the binding in one namespace changes, the
...@@ -245,11 +245,11 @@ Using the Batteries ...@@ -245,11 +245,11 @@ Using the Batteries
Every so often, people seem to be writing stuff in the Python library again, 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 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 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 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 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:: Compare::
...@@ -284,7 +284,7 @@ Using Backslash to Continue Statements ...@@ -284,7 +284,7 @@ Using Backslash to Continue Statements
====================================== ======================================
Since Python treats a newline as a statement terminator, and since 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 \ if foo.bar()['first'][0] == baz.quux(1, 2)[5:9] and \
calculate_number(10, 20) != forbulate(500, 360): calculate_number(10, 20) != forbulate(500, 360):
......
...@@ -311,7 +311,7 @@ geturl, and info, methods. :: ...@@ -311,7 +311,7 @@ geturl, and info, methods. ::
>>> req = urllib2.Request('http://www.python.org/fish.html') >>> req = urllib2.Request('http://www.python.org/fish.html')
>>> try: >>> try:
>>> urllib2.urlopen(req) >>> urllib2.urlopen(req)
>>> except URLError, e: >>> except HTTPError, e:
>>> print e.code >>> print e.code
>>> print e.read() >>> print e.read()
>>> >>>
......
...@@ -13,7 +13,7 @@ cur.execute("select ?", (AUSTRIA,)) ...@@ -13,7 +13,7 @@ cur.execute("select ?", (AUSTRIA,))
row = cur.fetchone() row = cur.fetchone()
assert row[0] == AUSTRIA assert row[0] == AUSTRIA
# but we can make pysqlite always return bytestrings ... # but we can make sqlite3 always return bytestrings ...
con.text_factory = str con.text_factory = str
cur.execute("select ?", (AUSTRIA,)) cur.execute("select ?", (AUSTRIA,))
row = cur.fetchone() row = cur.fetchone()
...@@ -26,11 +26,12 @@ assert row[0] == AUSTRIA.encode("utf-8") ...@@ -26,11 +26,12 @@ assert row[0] == AUSTRIA.encode("utf-8")
# here we implement one that will ignore Unicode characters that cannot be # here we implement one that will ignore Unicode characters that cannot be
# decoded from UTF-8 # decoded from UTF-8
con.text_factory = lambda x: unicode(x, "utf-8", "ignore") 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() row = cur.fetchone()
assert type(row[0]) == unicode 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 # objects, if the data is in ASCII only, and otherwise return unicode objects
con.text_factory = sqlite3.OptimizedUnicode con.text_factory = sqlite3.OptimizedUnicode
cur.execute("select ?", (AUSTRIA,)) cur.execute("select ?", (AUSTRIA,))
......
...@@ -28,18 +28,32 @@ these modules is installed, the slow-but-simple implementation in module ...@@ -28,18 +28,32 @@ these modules is installed, the slow-but-simple implementation in module
Open the database file *filename* and return a corresponding object. Open the database file *filename* and return a corresponding object.
If the database file already exists, the :mod:`whichdb` module is used to 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 determine its type and the appropriate module is used; if it does not exist,
first module listed above that can be imported is used. the first module listed above that can be imported is used.
The optional *flag* argument can be ``'r'`` to open an existing database for The optional *flag* argument must be one of these values:
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 | Value | Meaning |
``'r'``. +=========+===========================================+
| ``'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 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 database has to be created. It defaults to octal ``0666`` (and will be
by the prevailing umask). modified by the prevailing umask).
.. exception:: error .. exception:: error
......
...@@ -341,9 +341,9 @@ within *IDLE* or *PythonWin*:: ...@@ -341,9 +341,9 @@ within *IDLE* or *PythonWin*::
>>> printf("Hello, %s\n", "World!") >>> printf("Hello, %s\n", "World!")
Hello, World! Hello, World!
14 14
>>> printf("Hello, %S", u"World!") >>> printf("Hello, %S\n", u"World!")
Hello, World! Hello, World!
13 14
>>> printf("%d bottles of beer\n", 42) >>> printf("%d bottles of beer\n", 42)
42 bottles of beer 42 bottles of beer
19 19
...@@ -358,7 +358,7 @@ unicode strings have to be wrapped in their corresponding ``ctypes`` type, so ...@@ -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:: that they can be converted to the required C data type::
>>> printf("An int %d, a double %f\n", 1234, c_double(3.14)) >>> 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 31
>>> >>>
...@@ -414,9 +414,9 @@ prototype for a C function), and tries to convert the arguments to valid types:: ...@@ -414,9 +414,9 @@ prototype for a C function), and tries to convert the arguments to valid types::
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in ? File "<stdin>", line 1, in ?
ArgumentError: argument 2: exceptions.TypeError: wrong type ArgumentError: argument 2: exceptions.TypeError: wrong type
>>> printf("%s %d %f", "X", 2, 3) >>> printf("%s %d %f\n", "X", 2, 3)
X 2 3.00000012 X 2 3.000000
12 13
>>> >>>
If you have defined your own classes which you pass to function calls, you have If you have defined your own classes which you pass to function calls, you have
......
.. _email-examples:
:mod:`email`: Examples :mod:`email`: Examples
---------------------- ----------------------
......
...@@ -1398,7 +1398,7 @@ available. They are listed here in alphabetical order. ...@@ -1398,7 +1398,7 @@ available. They are listed here in alphabetical order.
>>> zipped >>> zipped
[(1, 4), (2, 5), (3, 6)] [(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zipped) >>> x2, y2 = zip(*zipped)
>>> x == x2, y == y2 >>> x == list(x2) and y == list(y2)
True True
.. versionadded:: 2.0 .. versionadded:: 2.0
...@@ -1468,7 +1468,7 @@ available. They are listed here in alphabetical order. ...@@ -1468,7 +1468,7 @@ available. They are listed here in alphabetical order.
names. names.
If you simply want to import a module (potentially within a package) by name, 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 >>> import sys
>>> name = 'foo.bar.baz' >>> name = 'foo.bar.baz'
......
...@@ -1077,10 +1077,10 @@ to a particular option, or fail to pass a required option attribute, ...@@ -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 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. ``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 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) * ``nargs`` (default: 1)
......
...@@ -354,7 +354,7 @@ These functions create new file objects. (See also :func:`open`.) ...@@ -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 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 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 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`` except that when the exit status is zero (termination without errors), ``None``
is returned. Availability: Unix, Windows. is returned. Availability: Unix, Windows.
...@@ -475,9 +475,9 @@ by file descriptors. ...@@ -475,9 +475,9 @@ by file descriptors.
.. note:: .. note::
This function is intended for low-level I/O and must be applied to a file 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 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) .. function:: closerange(fd_low, fd_high)
...@@ -604,8 +604,8 @@ by file descriptors. ...@@ -604,8 +604,8 @@ by file descriptors.
.. note:: .. note::
This function is intended for low-level I/O. For normal usage, use the built-in 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 function :func:`open`, which returns a "file object" with :meth:`~file.read` and
:meth:`write` methods (and many more). To wrap a file descriptor in a "file :meth:`~file.write` methods (and many more). To wrap a file descriptor in a "file
object", use :func:`fdopen`. object", use :func:`fdopen`.
...@@ -634,22 +634,22 @@ by file descriptors. ...@@ -634,22 +634,22 @@ by file descriptors.
.. note:: .. note::
This function is intended for low-level I/O and must be applied to a file 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 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` :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`~file.read` or
methods. :meth:`~file.readline` methods.
.. function:: tcgetpgrp(fd) .. function:: tcgetpgrp(fd)
Return the process group associated with the terminal given by *fd* (an open 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) .. function:: tcsetpgrp(fd, pg)
Set the process group associated with the terminal given by *fd* (an open file 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) .. function:: ttyname(fd)
...@@ -667,13 +667,13 @@ by file descriptors. ...@@ -667,13 +667,13 @@ by file descriptors.
.. note:: .. note::
This function is intended for low-level I/O and must be applied to a file 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 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` :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its
method. :meth:`~file.write` method.
The following constants are options for the *flags* parameter to the 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 ``|``. 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 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. or `the MSDN <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>` on Windows.
...@@ -929,7 +929,8 @@ Files and Directories ...@@ -929,7 +929,8 @@ Files and Directories
.. versionchanged:: 2.3 .. versionchanged:: 2.3
On Windows NT/2k/XP and Unix, if *path* is a Unicode object, the result will be 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) .. function:: lstat(path)
......
:mod:`shelve` --- Python object persistence :mod:`shelve` --- Python object persistence
=========================================== ===========================================
...@@ -40,7 +39,7 @@ lots of shared sub-objects. The keys are ordinary strings. ...@@ -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 written back (there is no way to determine which accessed
entries are mutable, nor which ones were actually mutated). 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. transition from dictionary based scripts to those requiring persistent storage.
One additional method is supported: One additional method is supported:
......
...@@ -380,3 +380,8 @@ example doesn't do any processing of the :rfc:`822` headers. In particular, the ...@@ -380,3 +380,8 @@ example doesn't do any processing of the :rfc:`822` headers. In particular, the
server.sendmail(fromaddr, toaddrs, msg) server.sendmail(fromaddr, toaddrs, msg)
server.quit() 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`.
...@@ -15,7 +15,7 @@ SQLite for internal data storage. It's also possible to prototype an ...@@ -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 application using SQLite and then port the code to a larger database such as
PostgreSQL or Oracle. 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`. with the DB-API 2.0 specification described by :pep:`249`.
To use the module, you must first create a :class:`Connection` object that 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. ...@@ -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 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 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 second argument to the cursor's :meth:`~Cursor.execute` method. (Other database
may use a different placeholder, such as ``%s`` or ``:1``.) For example:: modules may use a different placeholder, such as ``%s`` or ``:1``.) For
example::
# Never do this -- insecure! # Never do this -- insecure!
symbol = 'IBM' symbol = 'IBM'
...@@ -92,11 +93,12 @@ This example uses the iterator form:: ...@@ -92,11 +93,12 @@ This example uses the iterator form::
.. seealso:: .. seealso::
http://www.pysqlite.org http://www.pysqlite.org
The pysqlite web page. The pysqlite web page -- sqlite3 is developed externally under the name
"pysqlite".
http://www.sqlite.org http://www.sqlite.org
The SQLite web page; the documentation describes the syntax and the available The SQLite web page; the documentation describes the syntax and the
data types for the supported SQL dialect. available data types for the supported SQL dialect.
:pep:`249` - Database API Specification 2.0 :pep:`249` - Database API Specification 2.0
PEP written by Marc-André Lemburg. PEP written by Marc-André Lemburg.
...@@ -802,10 +804,10 @@ So if you are within a transaction and issue a command like ``CREATE TABLE ...@@ -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 ...``, ``VACUUM``, ``PRAGMA``, the :mod:`sqlite3` module will commit implicitly
before executing that command. There are two reasons for doing that. The first 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 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). 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` (or none at all) via the *isolation_level* parameter to the :func:`connect`
call, or via the :attr:`isolation_level` property of connections. 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", ...@@ -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 Using shortcut methods
......
...@@ -1955,7 +1955,7 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: ...@@ -1955,7 +1955,7 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
note for :meth:`dict.items`. note for :meth:`dict.items`.
Using :meth:`iteritems` while adding or deleting entries in the dictionary 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 .. versionadded:: 2.2
...@@ -1965,7 +1965,7 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: ...@@ -1965,7 +1965,7 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
:meth:`dict.items`. :meth:`dict.items`.
Using :meth:`iterkeys` while adding or deleting entries in the dictionary 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 .. versionadded:: 2.2
...@@ -1975,7 +1975,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098: ...@@ -1975,7 +1975,8 @@ pairs within braces, for example: ``{'jack': 4098, 'sjoerd': 4127}`` or ``{4098:
:meth:`dict.items`. :meth:`dict.items`.
Using :meth:`itervalues` while adding or deleting entries in the 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 .. versionadded:: 2.2
......
...@@ -22,7 +22,7 @@ override the platform default list of browsers, as a os.pathsep-separated list ...@@ -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 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 ``%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 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 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 controlling process will not wait for the user to finish with the browser, but
...@@ -201,3 +201,8 @@ convenience functions: ...@@ -201,3 +201,8 @@ convenience functions:
.. versionadded:: 2.5 .. 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.
...@@ -30,7 +30,7 @@ DOM applications typically start by parsing some XML into a DOM. With ...@@ -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. 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 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 either a file name, or a file-like object. *parser*, if given, must be a SAX2
......
...@@ -1858,11 +1858,11 @@ sequences, it should iterate through the values. ...@@ -1858,11 +1858,11 @@ sequences, it should iterate through the values.
reverse iteration. It should return a new iterator object that iterates reverse iteration. It should return a new iterator object that iterates
over all the objects in the container in reverse order. over all the objects in the container in reverse order.
If the :meth:`__reversed__` method is not provided, the If the :meth:`__reversed__` method is not provided, the :func:`reversed`
:func:`reversed` builtin will fall back to using the sequence protocol builtin will fall back to using the sequence protocol (:meth:`__len__` and
(:meth:`__len__` and :meth:`__getitem__`). Objects should normally :meth:`__getitem__`). Objects that support the sequence protocol should
only provide :meth:`__reversed__` if they do not support the sequence only provide :meth:`__reversed__` if they can provide an implementation
protocol and an efficient implementation of reverse iteration is possible. that is more efficient than the one provided by :func:`reversed`.
.. versionadded:: 2.6 .. versionadded:: 2.6
......
...@@ -386,9 +386,10 @@ first converted to a string using the rules for string conversions. The ...@@ -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 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 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 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 standard output is a whitespace character except ``' '``, or (3) when the last
output was not a :keyword:`print` statement. (In some cases it may be write operation on standard output was not a :keyword:`print` statement.
functional to write an empty string to standard output for this reason.) (In some cases it may be functional to write an empty string to standard output
for this reason.)
.. note:: .. note::
......
...@@ -216,7 +216,7 @@ Raising Exceptions ...@@ -216,7 +216,7 @@ Raising Exceptions
The :keyword:`raise` statement allows the programmer to force a specified The :keyword:`raise` statement allows the programmer to force a specified
exception to occur. For example:: exception to occur. For example::
>>> raise NameError, 'HiThere' >>> raise NameError('HiThere')
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in ? File "<stdin>", line 1, in ?
NameError: HiThere NameError: HiThere
...@@ -231,7 +231,7 @@ handle it, a simpler form of the :keyword:`raise` statement allows you to ...@@ -231,7 +231,7 @@ handle it, a simpler form of the :keyword:`raise` statement allows you to
re-raise the exception:: re-raise the exception::
>>> try: >>> try:
... raise NameError, 'HiThere' ... raise NameError('HiThere')
... except NameError: ... except NameError:
... print 'An exception flew by!' ... print 'An exception flew by!'
... raise ... raise
...@@ -263,7 +263,7 @@ directly or indirectly. For example:: ...@@ -263,7 +263,7 @@ directly or indirectly. For example::
... print 'My exception occurred, value:', e.value ... print 'My exception occurred, value:', e.value
... ...
My exception occurred, value: 4 My exception occurred, value: 4
>>> raise MyError, 'oops!' >>> raise MyError('oops!')
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in ? File "<stdin>", line 1, in ?
__main__.MyError: 'oops!' __main__.MyError: 'oops!'
......
...@@ -285,11 +285,11 @@ position in the string results in an error:: ...@@ -285,11 +285,11 @@ position in the string results in an error::
>>> word[0] = 'x' >>> word[0] = 'x'
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in ? File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment TypeError: object does not support item assignment
>>> word[:1] = 'Splat' >>> word[:1] = 'Splat'
Traceback (most recent call last): Traceback (most recent call last):
File "<stdin>", line 1, in ? 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:: However, creating a new string with the combined content is easy and efficient::
......
...@@ -79,7 +79,7 @@ def updatecache(filename, module_globals=None): ...@@ -79,7 +79,7 @@ def updatecache(filename, module_globals=None):
try: try:
stat = os.stat(fullname) stat = os.stat(fullname)
except os.error, msg: except os.error, msg:
basename = os.path.split(filename)[1] basename = filename
# Try for a __loader__, if available # Try for a __loader__, if available
if module_globals and '__loader__' in module_globals: if module_globals and '__loader__' in module_globals:
...@@ -103,7 +103,10 @@ def updatecache(filename, module_globals=None): ...@@ -103,7 +103,10 @@ def updatecache(filename, module_globals=None):
) )
return cache[filename][2] 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: for dirname in sys.path:
# When using imputil, sys.path may contain things other than # When using imputil, sys.path may contain things other than
......
""" 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()
...@@ -220,6 +220,9 @@ Library ...@@ -220,6 +220,9 @@ Library
- Issue #6062: In distutils, fixed the package option of build_ext. Feedback - Issue #6062: In distutils, fixed the package option of build_ext. Feedback
and tests on pywin32 by Tim Golden. 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 - Issue #6046: Fixed the library extension when distutils build_ext is used
inplace. Initial patch by Roumen Petrov. inplace. Initial patch by Roumen Petrov.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment