2007-08-15 11:28:22 -03:00
|
|
|
|
|
|
|
:mod:`parser` --- Access Python parse trees
|
|
|
|
===========================================
|
|
|
|
|
|
|
|
.. module:: parser
|
|
|
|
:synopsis: Access parse trees for Python source code.
|
|
|
|
.. moduleauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
|
|
|
|
.. sectionauthor:: Fred L. Drake, Jr. <fdrake@acm.org>
|
|
|
|
|
|
|
|
|
|
|
|
.. % Copyright 1995 Virginia Polytechnic Institute and State University
|
|
|
|
.. % and Fred L. Drake, Jr. This copyright notice must be distributed on
|
|
|
|
.. % all copies, but this document otherwise may be distributed as part
|
|
|
|
.. % of the Python distribution. No fee may be charged for this document
|
|
|
|
.. % in any representation, either on paper or electronically. This
|
|
|
|
.. % restriction does not affect other elements in a distributed package
|
|
|
|
.. % in any way.
|
|
|
|
|
|
|
|
.. index:: single: parsing; Python source code
|
|
|
|
|
|
|
|
The :mod:`parser` module provides an interface to Python's internal parser and
|
|
|
|
byte-code compiler. The primary purpose for this interface is to allow Python
|
|
|
|
code to edit the parse tree of a Python expression and create executable code
|
|
|
|
from this. This is better than trying to parse and modify an arbitrary Python
|
|
|
|
code fragment as a string because parsing is performed in a manner identical to
|
|
|
|
the code forming the application. It is also faster.
|
|
|
|
|
|
|
|
There are a few things to note about this module which are important to making
|
|
|
|
use of the data structures created. This is not a tutorial on editing the parse
|
|
|
|
trees for Python code, but some examples of using the :mod:`parser` module are
|
|
|
|
presented.
|
|
|
|
|
|
|
|
Most importantly, a good understanding of the Python grammar processed by the
|
|
|
|
internal parser is required. For full information on the language syntax, refer
|
|
|
|
to :ref:`reference-index`. The parser
|
|
|
|
itself is created from a grammar specification defined in the file
|
|
|
|
:file:`Grammar/Grammar` in the standard Python distribution. The parse trees
|
|
|
|
stored in the AST objects created by this module are the actual output from the
|
|
|
|
internal parser when created by the :func:`expr` or :func:`suite` functions,
|
|
|
|
described below. The AST objects created by :func:`sequence2ast` faithfully
|
|
|
|
simulate those structures. Be aware that the values of the sequences which are
|
|
|
|
considered "correct" will vary from one version of Python to another as the
|
|
|
|
formal grammar for the language is revised. However, transporting code from one
|
|
|
|
Python version to another as source text will always allow correct parse trees
|
|
|
|
to be created in the target version, with the only restriction being that
|
|
|
|
migrating to an older version of the interpreter will not support more recent
|
|
|
|
language constructs. The parse trees are not typically compatible from one
|
|
|
|
version to another, whereas source code has always been forward-compatible.
|
|
|
|
|
|
|
|
Each element of the sequences returned by :func:`ast2list` or :func:`ast2tuple`
|
|
|
|
has a simple form. Sequences representing non-terminal elements in the grammar
|
|
|
|
always have a length greater than one. The first element is an integer which
|
|
|
|
identifies a production in the grammar. These integers are given symbolic names
|
|
|
|
in the C header file :file:`Include/graminit.h` and the Python module
|
|
|
|
:mod:`symbol`. Each additional element of the sequence represents a component
|
|
|
|
of the production as recognized in the input string: these are always sequences
|
|
|
|
which have the same form as the parent. An important aspect of this structure
|
|
|
|
which should be noted is that keywords used to identify the parent node type,
|
|
|
|
such as the keyword :keyword:`if` in an :const:`if_stmt`, are included in the
|
|
|
|
node tree without any special treatment. For example, the :keyword:`if` keyword
|
|
|
|
is represented by the tuple ``(1, 'if')``, where ``1`` is the numeric value
|
|
|
|
associated with all :const:`NAME` tokens, including variable and function names
|
|
|
|
defined by the user. In an alternate form returned when line number information
|
|
|
|
is requested, the same token might be represented as ``(1, 'if', 12)``, where
|
|
|
|
the ``12`` represents the line number at which the terminal symbol was found.
|
|
|
|
|
|
|
|
Terminal elements are represented in much the same way, but without any child
|
|
|
|
elements and the addition of the source text which was identified. The example
|
|
|
|
of the :keyword:`if` keyword above is representative. The various types of
|
|
|
|
terminal symbols are defined in the C header file :file:`Include/token.h` and
|
|
|
|
the Python module :mod:`token`.
|
|
|
|
|
|
|
|
The AST objects are not required to support the functionality of this module,
|
|
|
|
but are provided for three purposes: to allow an application to amortize the
|
|
|
|
cost of processing complex parse trees, to provide a parse tree representation
|
|
|
|
which conserves memory space when compared to the Python list or tuple
|
|
|
|
representation, and to ease the creation of additional modules in C which
|
|
|
|
manipulate parse trees. A simple "wrapper" class may be created in Python to
|
|
|
|
hide the use of AST objects.
|
|
|
|
|
|
|
|
The :mod:`parser` module defines functions for a few distinct purposes. The
|
|
|
|
most important purposes are to create AST objects and to convert AST objects to
|
|
|
|
other representations such as parse trees and compiled code objects, but there
|
|
|
|
are also functions which serve to query the type of parse tree represented by an
|
|
|
|
AST object.
|
|
|
|
|
|
|
|
|
|
|
|
.. seealso::
|
|
|
|
|
|
|
|
Module :mod:`symbol`
|
|
|
|
Useful constants representing internal nodes of the parse tree.
|
|
|
|
|
|
|
|
Module :mod:`token`
|
|
|
|
Useful constants representing leaf nodes of the parse tree and functions for
|
|
|
|
testing node values.
|
|
|
|
|
|
|
|
|
|
|
|
.. _creating-asts:
|
|
|
|
|
|
|
|
Creating AST Objects
|
|
|
|
--------------------
|
|
|
|
|
|
|
|
AST objects may be created from source code or from a parse tree. When creating
|
|
|
|
an AST object from source, different functions are used to create the ``'eval'``
|
|
|
|
and ``'exec'`` forms.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: expr(source)
|
|
|
|
|
|
|
|
The :func:`expr` function parses the parameter *source* as if it were an input
|
|
|
|
to ``compile(source, 'file.py', 'eval')``. If the parse succeeds, an AST object
|
|
|
|
is created to hold the internal parse tree representation, otherwise an
|
|
|
|
appropriate exception is thrown.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: suite(source)
|
|
|
|
|
|
|
|
The :func:`suite` function parses the parameter *source* as if it were an input
|
|
|
|
to ``compile(source, 'file.py', 'exec')``. If the parse succeeds, an AST object
|
|
|
|
is created to hold the internal parse tree representation, otherwise an
|
|
|
|
appropriate exception is thrown.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: sequence2ast(sequence)
|
|
|
|
|
|
|
|
This function accepts a parse tree represented as a sequence and builds an
|
|
|
|
internal representation if possible. If it can validate that the tree conforms
|
|
|
|
to the Python grammar and all nodes are valid node types in the host version of
|
|
|
|
Python, an AST object is created from the internal representation and returned
|
|
|
|
to the called. If there is a problem creating the internal representation, or
|
|
|
|
if the tree cannot be validated, a :exc:`ParserError` exception is thrown. An
|
|
|
|
AST object created this way should not be assumed to compile correctly; normal
|
|
|
|
exceptions thrown by compilation may still be initiated when the AST object is
|
|
|
|
passed to :func:`compileast`. This may indicate problems not related to syntax
|
|
|
|
(such as a :exc:`MemoryError` exception), but may also be due to constructs such
|
|
|
|
as the result of parsing ``del f(0)``, which escapes the Python parser but is
|
|
|
|
checked by the bytecode compiler.
|
|
|
|
|
|
|
|
Sequences representing terminal tokens may be represented as either two-element
|
|
|
|
lists of the form ``(1, 'name')`` or as three-element lists of the form ``(1,
|
|
|
|
'name', 56)``. If the third element is present, it is assumed to be a valid
|
|
|
|
line number. The line number may be specified for any subset of the terminal
|
|
|
|
symbols in the input tree.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: tuple2ast(sequence)
|
|
|
|
|
|
|
|
This is the same function as :func:`sequence2ast`. This entry point is
|
|
|
|
maintained for backward compatibility.
|
|
|
|
|
|
|
|
|
|
|
|
.. _converting-asts:
|
|
|
|
|
|
|
|
Converting AST Objects
|
|
|
|
----------------------
|
|
|
|
|
|
|
|
AST objects, regardless of the input used to create them, may be converted to
|
|
|
|
parse trees represented as list- or tuple- trees, or may be compiled into
|
|
|
|
executable code objects. Parse trees may be extracted with or without line
|
|
|
|
numbering information.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: ast2list(ast[, line_info])
|
|
|
|
|
|
|
|
This function accepts an AST object from the caller in *ast* and returns a
|
|
|
|
Python list representing the equivalent parse tree. The resulting list
|
|
|
|
representation can be used for inspection or the creation of a new parse tree in
|
|
|
|
list form. This function does not fail so long as memory is available to build
|
|
|
|
the list representation. If the parse tree will only be used for inspection,
|
|
|
|
:func:`ast2tuple` should be used instead to reduce memory consumption and
|
|
|
|
fragmentation. When the list representation is required, this function is
|
|
|
|
significantly faster than retrieving a tuple representation and converting that
|
|
|
|
to nested lists.
|
|
|
|
|
|
|
|
If *line_info* is true, line number information will be included for all
|
|
|
|
terminal tokens as a third element of the list representing the token. Note
|
|
|
|
that the line number provided specifies the line on which the token *ends*.
|
|
|
|
This information is omitted if the flag is false or omitted.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: ast2tuple(ast[, line_info])
|
|
|
|
|
|
|
|
This function accepts an AST object from the caller in *ast* and returns a
|
|
|
|
Python tuple representing the equivalent parse tree. Other than returning a
|
|
|
|
tuple instead of a list, this function is identical to :func:`ast2list`.
|
|
|
|
|
|
|
|
If *line_info* is true, line number information will be included for all
|
|
|
|
terminal tokens as a third element of the list representing the token. This
|
|
|
|
information is omitted if the flag is false or omitted.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: compileast(ast[, filename='<ast>'])
|
|
|
|
|
|
|
|
.. index::
|
|
|
|
builtin: exec
|
|
|
|
builtin: eval
|
|
|
|
|
|
|
|
The Python byte compiler can be invoked on an AST object to produce code objects
|
|
|
|
which can be used as part of a call to the built-in :func:`exec` or :func:`eval`
|
|
|
|
functions. This function provides the interface to the compiler, passing the
|
|
|
|
internal parse tree from *ast* to the parser, using the source file name
|
|
|
|
specified by the *filename* parameter. The default value supplied for *filename*
|
|
|
|
indicates that the source was an AST object.
|
|
|
|
|
|
|
|
Compiling an AST object may result in exceptions related to compilation; an
|
|
|
|
example would be a :exc:`SyntaxError` caused by the parse tree for ``del f(0)``:
|
|
|
|
this statement is considered legal within the formal grammar for Python but is
|
|
|
|
not a legal language construct. The :exc:`SyntaxError` raised for this
|
|
|
|
condition is actually generated by the Python byte-compiler normally, which is
|
|
|
|
why it can be raised at this point by the :mod:`parser` module. Most causes of
|
|
|
|
compilation failure can be diagnosed programmatically by inspection of the parse
|
|
|
|
tree.
|
|
|
|
|
|
|
|
|
|
|
|
.. _querying-asts:
|
|
|
|
|
|
|
|
Queries on AST Objects
|
|
|
|
----------------------
|
|
|
|
|
|
|
|
Two functions are provided which allow an application to determine if an AST was
|
|
|
|
created as an expression or a suite. Neither of these functions can be used to
|
|
|
|
determine if an AST was created from source code via :func:`expr` or
|
|
|
|
:func:`suite` or from a parse tree via :func:`sequence2ast`.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: isexpr(ast)
|
|
|
|
|
|
|
|
.. index:: builtin: compile
|
|
|
|
|
|
|
|
When *ast* represents an ``'eval'`` form, this function returns true, otherwise
|
|
|
|
it returns false. This is useful, since code objects normally cannot be queried
|
|
|
|
for this information using existing built-in functions. Note that the code
|
|
|
|
objects created by :func:`compileast` cannot be queried like this either, and
|
|
|
|
are identical to those created by the built-in :func:`compile` function.
|
|
|
|
|
|
|
|
|
|
|
|
.. function:: issuite(ast)
|
|
|
|
|
|
|
|
This function mirrors :func:`isexpr` in that it reports whether an AST object
|
|
|
|
represents an ``'exec'`` form, commonly known as a "suite." It is not safe to
|
|
|
|
assume that this function is equivalent to ``not isexpr(ast)``, as additional
|
|
|
|
syntactic fragments may be supported in the future.
|
|
|
|
|
|
|
|
|
|
|
|
.. _ast-errors:
|
|
|
|
|
|
|
|
Exceptions and Error Handling
|
|
|
|
-----------------------------
|
|
|
|
|
|
|
|
The parser module defines a single exception, but may also pass other built-in
|
|
|
|
exceptions from other portions of the Python runtime environment. See each
|
|
|
|
function for information about the exceptions it can raise.
|
|
|
|
|
|
|
|
|
|
|
|
.. exception:: ParserError
|
|
|
|
|
|
|
|
Exception raised when a failure occurs within the parser module. This is
|
|
|
|
generally produced for validation failures rather than the built in
|
|
|
|
:exc:`SyntaxError` thrown during normal parsing. The exception argument is
|
|
|
|
either a string describing the reason of the failure or a tuple containing a
|
|
|
|
sequence causing the failure from a parse tree passed to :func:`sequence2ast`
|
|
|
|
and an explanatory string. Calls to :func:`sequence2ast` need to be able to
|
|
|
|
handle either type of exception, while calls to other functions in the module
|
|
|
|
will only need to be aware of the simple string values.
|
|
|
|
|
|
|
|
Note that the functions :func:`compileast`, :func:`expr`, and :func:`suite` may
|
|
|
|
throw exceptions which are normally thrown by the parsing and compilation
|
|
|
|
process. These include the built in exceptions :exc:`MemoryError`,
|
|
|
|
:exc:`OverflowError`, :exc:`SyntaxError`, and :exc:`SystemError`. In these
|
|
|
|
cases, these exceptions carry all the meaning normally associated with them.
|
|
|
|
Refer to the descriptions of each function for detailed information.
|
|
|
|
|
|
|
|
|
|
|
|
.. _ast-objects:
|
|
|
|
|
|
|
|
AST Objects
|
|
|
|
-----------
|
|
|
|
|
|
|
|
Ordered and equality comparisons are supported between AST objects. Pickling of
|
|
|
|
AST objects (using the :mod:`pickle` module) is also supported.
|
|
|
|
|
|
|
|
|
|
|
|
.. data:: ASTType
|
|
|
|
|
|
|
|
The type of the objects returned by :func:`expr`, :func:`suite` and
|
|
|
|
:func:`sequence2ast`.
|
|
|
|
|
|
|
|
AST objects have the following methods:
|
|
|
|
|
|
|
|
|
|
|
|
.. method:: AST.compile([filename])
|
|
|
|
|
|
|
|
Same as ``compileast(ast, filename)``.
|
|
|
|
|
|
|
|
|
|
|
|
.. method:: AST.isexpr()
|
|
|
|
|
|
|
|
Same as ``isexpr(ast)``.
|
|
|
|
|
|
|
|
|
|
|
|
.. method:: AST.issuite()
|
|
|
|
|
|
|
|
Same as ``issuite(ast)``.
|
|
|
|
|
|
|
|
|
|
|
|
.. method:: AST.tolist([line_info])
|
|
|
|
|
|
|
|
Same as ``ast2list(ast, line_info)``.
|
|
|
|
|
|
|
|
|
|
|
|
.. method:: AST.totuple([line_info])
|
|
|
|
|
|
|
|
Same as ``ast2tuple(ast, line_info)``.
|
|
|
|
|
|
|
|
|
|
|
|
.. _ast-examples:
|
|
|
|
|
|
|
|
Examples
|
|
|
|
--------
|
|
|
|
|
|
|
|
.. index:: builtin: compile
|
|
|
|
|
|
|
|
The parser modules allows operations to be performed on the parse tree of Python
|
#1370: Finish the merge r58749, log below, by resolving all conflicts in Doc/.
Merged revisions 58221-58741 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r58221 | georg.brandl | 2007-09-20 10:57:59 -0700 (Thu, 20 Sep 2007) | 2 lines
Patch #1181: add os.environ.clear() method.
........
r58225 | sean.reifschneider | 2007-09-20 23:33:28 -0700 (Thu, 20 Sep 2007) | 3 lines
Issue1704287: "make install" fails unless you do "make" first. Make
oldsharedmods and sharedmods in "libinstall".
........
r58232 | guido.van.rossum | 2007-09-22 13:18:03 -0700 (Sat, 22 Sep 2007) | 4 lines
Patch # 188 by Philip Jenvey.
Make tell() mark CRLF as a newline.
With unit test.
........
r58242 | georg.brandl | 2007-09-24 10:55:47 -0700 (Mon, 24 Sep 2007) | 2 lines
Fix typo and double word.
........
r58245 | georg.brandl | 2007-09-24 10:59:28 -0700 (Mon, 24 Sep 2007) | 2 lines
#1196: document default radix for int().
........
r58247 | georg.brandl | 2007-09-24 11:08:24 -0700 (Mon, 24 Sep 2007) | 2 lines
#1177: accept 2xx responses for https too, not only http.
........
r58249 | andrew.kuchling | 2007-09-24 16:45:51 -0700 (Mon, 24 Sep 2007) | 1 line
Remove stray odd character; grammar fix
........
r58250 | andrew.kuchling | 2007-09-24 16:46:28 -0700 (Mon, 24 Sep 2007) | 1 line
Typo fix
........
r58251 | andrew.kuchling | 2007-09-24 17:09:42 -0700 (Mon, 24 Sep 2007) | 1 line
Add various items
........
r58268 | vinay.sajip | 2007-09-26 22:34:45 -0700 (Wed, 26 Sep 2007) | 1 line
Change to flush and close logic to fix #1760556.
........
r58269 | vinay.sajip | 2007-09-26 22:38:51 -0700 (Wed, 26 Sep 2007) | 1 line
Change to basicConfig() to fix #1021.
........
r58270 | georg.brandl | 2007-09-26 23:26:58 -0700 (Wed, 26 Sep 2007) | 2 lines
#1208: document match object's boolean value.
........
r58271 | vinay.sajip | 2007-09-26 23:56:13 -0700 (Wed, 26 Sep 2007) | 1 line
Minor date change.
........
r58272 | vinay.sajip | 2007-09-27 00:35:10 -0700 (Thu, 27 Sep 2007) | 1 line
Change to LogRecord.__init__() to fix #1206. Note that archaic use of type(x) == types.DictType is because of keeping 1.5.2 compatibility. While this is much less relevant these days, there probably needs to be a separate commit for removing all archaic constructs at the same time.
........
r58288 | brett.cannon | 2007-09-30 12:45:10 -0700 (Sun, 30 Sep 2007) | 9 lines
tuple.__repr__ did not consider a reference loop as it is not possible from
Python code; but it is possible from C. object.__str__ had the issue of not
expecting a type to doing something within it's tp_str implementation that
could trigger an infinite recursion, but it could in C code.. Both found
thanks to BaseException and how it handles its repr.
Closes issue #1686386. Thanks to Thomas Herve for taking an initial stab at
coming up with a solution.
........
r58289 | brett.cannon | 2007-09-30 13:37:19 -0700 (Sun, 30 Sep 2007) | 3 lines
Fix error introduced by r58288; if a tuple is length 0 return its repr and
don't worry about any self-referring tuples.
........
r58294 | facundo.batista | 2007-10-02 10:01:24 -0700 (Tue, 02 Oct 2007) | 11 lines
Made the various is_* operations return booleans. This was discussed
with Cawlishaw by mail, and he basically confirmed that to these is_*
operations, there's no need to return Decimal(0) and Decimal(1) if
the language supports the False and True booleans.
Also added a few tests for the these functions in extra.decTest, since
they are mostly untested (apart from the doctests).
Thanks Mark Dickinson
........
r58295 | facundo.batista | 2007-10-02 11:21:18 -0700 (Tue, 02 Oct 2007) | 4 lines
Added a class to store the digits of log(10), so that they can be made
available when necessary without recomputing. Thanks Mark Dickinson
........
r58299 | mark.summerfield | 2007-10-03 01:53:21 -0700 (Wed, 03 Oct 2007) | 4 lines
Added note in footnote about string comparisons about
unicodedata.normalize().
........
r58304 | raymond.hettinger | 2007-10-03 14:18:11 -0700 (Wed, 03 Oct 2007) | 1 line
enumerate() is no longer bounded to using sequences shorter than LONG_MAX. The possibility of overflow was sending some newsgroup posters into a tizzy.
........
r58305 | raymond.hettinger | 2007-10-03 17:20:27 -0700 (Wed, 03 Oct 2007) | 1 line
itertools.count() no longer limited to sys.maxint.
........
r58306 | kurt.kaiser | 2007-10-03 18:49:54 -0700 (Wed, 03 Oct 2007) | 3 lines
Assume that the user knows when he wants to end the line; don't insert
something he didn't select or complete.
........
r58307 | kurt.kaiser | 2007-10-03 19:07:50 -0700 (Wed, 03 Oct 2007) | 2 lines
Remove unused theme that was causing a fault in p3k.
........
r58308 | kurt.kaiser | 2007-10-03 19:09:17 -0700 (Wed, 03 Oct 2007) | 2 lines
Clean up EditorWindow close.
........
r58309 | kurt.kaiser | 2007-10-03 19:53:07 -0700 (Wed, 03 Oct 2007) | 7 lines
textView cleanup. Patch 1718043 Tal Einat.
M idlelib/EditorWindow.py
M idlelib/aboutDialog.py
M idlelib/textView.py
M idlelib/NEWS.txt
........
r58310 | kurt.kaiser | 2007-10-03 20:11:12 -0700 (Wed, 03 Oct 2007) | 3 lines
configDialog cleanup. Patch 1730217 Tal Einat.
........
r58311 | neal.norwitz | 2007-10-03 23:00:48 -0700 (Wed, 03 Oct 2007) | 4 lines
Coverity #151: Remove deadcode.
All this code already exists above starting at line 653.
........
r58325 | fred.drake | 2007-10-04 19:46:12 -0700 (Thu, 04 Oct 2007) | 1 line
wrap lines to <80 characters before fixing errors
........
r58326 | raymond.hettinger | 2007-10-04 19:47:07 -0700 (Thu, 04 Oct 2007) | 6 lines
Add __asdict__() to NamedTuple and refine the docs.
Add maxlen support to deque() and fixup docs.
Partially fix __reduce__(). The None as a third arg was no longer supported.
Still needs work on __reduce__() to handle recursive inputs.
........
r58327 | fred.drake | 2007-10-04 19:48:32 -0700 (Thu, 04 Oct 2007) | 3 lines
move descriptions of ac_(in|out)_buffer_size to the right place
http://bugs.python.org/issue1053
........
r58329 | neal.norwitz | 2007-10-04 20:39:17 -0700 (Thu, 04 Oct 2007) | 3 lines
dict could be NULL, so we need to XDECREF.
Fix a compiler warning about passing a PyTypeObject* instead of PyObject*.
........
r58330 | neal.norwitz | 2007-10-04 20:41:19 -0700 (Thu, 04 Oct 2007) | 2 lines
Fix Coverity #158: Check the correct variable.
........
r58332 | neal.norwitz | 2007-10-04 22:01:38 -0700 (Thu, 04 Oct 2007) | 7 lines
Fix Coverity #159.
This code was broken if save() returned a negative number since i contained
a boolean value and then we compared i < 0 which should never be true.
Will backport (assuming it's necessary)
........
r58334 | neal.norwitz | 2007-10-04 22:29:17 -0700 (Thu, 04 Oct 2007) | 1 line
Add a note about fixing some more warnings found by Coverity.
........
r58338 | raymond.hettinger | 2007-10-05 12:07:31 -0700 (Fri, 05 Oct 2007) | 1 line
Restore BEGIN/END THREADS macros which were squashed in the previous checkin
........
r58343 | gregory.p.smith | 2007-10-06 00:48:10 -0700 (Sat, 06 Oct 2007) | 3 lines
Stab in the dark attempt to fix the test_bsddb3 failure on sparc and S-390
ubuntu buildbots.
........
r58344 | gregory.p.smith | 2007-10-06 00:51:59 -0700 (Sat, 06 Oct 2007) | 2 lines
Allows BerkeleyDB 4.6.x >= 4.6.21 for the bsddb module.
........
r58348 | gregory.p.smith | 2007-10-06 08:47:37 -0700 (Sat, 06 Oct 2007) | 3 lines
Use the host the author likely meant in the first place. pop.gmail.com is
reliable. gmail.org is someones personal domain.
........
r58351 | neal.norwitz | 2007-10-06 12:16:28 -0700 (Sat, 06 Oct 2007) | 3 lines
Ensure that this test will pass even if another test left an unwritable TESTFN.
Also use the safe unlink in test_support instead of rolling our own here.
........
r58368 | georg.brandl | 2007-10-08 00:50:24 -0700 (Mon, 08 Oct 2007) | 3 lines
#1123: fix the docs for the str.split(None, sep) case.
Also expand a few other methods' docs, which had more info in the deprecated string module docs.
........
r58369 | georg.brandl | 2007-10-08 01:06:05 -0700 (Mon, 08 Oct 2007) | 2 lines
Update docstring of sched, also remove an unused assignment.
........
r58370 | raymond.hettinger | 2007-10-08 02:14:28 -0700 (Mon, 08 Oct 2007) | 5 lines
Add comments to NamedTuple code.
Let the field spec be either a string or a non-string sequence (suggested by Martin Blais with use cases).
Improve the error message in the case of a SyntaxError (caused by a duplicate field name).
........
r58371 | raymond.hettinger | 2007-10-08 02:56:29 -0700 (Mon, 08 Oct 2007) | 1 line
Missed a line in the docs
........
r58372 | raymond.hettinger | 2007-10-08 03:11:51 -0700 (Mon, 08 Oct 2007) | 1 line
Better variable names
........
r58376 | georg.brandl | 2007-10-08 07:12:47 -0700 (Mon, 08 Oct 2007) | 3 lines
#1199: docs for tp_as_{number,sequence,mapping}, by Amaury Forgeot d'Arc.
No need to merge this to py3k!
........
r58380 | raymond.hettinger | 2007-10-08 14:26:58 -0700 (Mon, 08 Oct 2007) | 1 line
Eliminate camelcase function name
........
r58381 | andrew.kuchling | 2007-10-08 16:23:03 -0700 (Mon, 08 Oct 2007) | 1 line
Eliminate camelcase function name
........
r58382 | raymond.hettinger | 2007-10-08 18:36:23 -0700 (Mon, 08 Oct 2007) | 1 line
Make the error messages more specific
........
r58384 | gregory.p.smith | 2007-10-08 23:02:21 -0700 (Mon, 08 Oct 2007) | 10 lines
Splits Modules/_bsddb.c up into bsddb.h and _bsddb.c and adds a C API
object available as bsddb.db.api. This is based on the patch submitted
by Duncan Grisby here:
http://sourceforge.net/tracker/index.php?func=detail&aid=1551895&group_id=13900&atid=313900
See this thread for additional info:
http://sourceforge.net/mailarchive/forum.php?thread_name=E1GAVDK-0002rk-Iw%40apasphere.com&forum_name=pybsddb-users
It also cleans up the code a little by removing some ifdef/endifs for
python prior to 2.1 and for unsupported Berkeley DB <= 3.2.
........
r58385 | gregory.p.smith | 2007-10-08 23:50:43 -0700 (Mon, 08 Oct 2007) | 5 lines
Fix a double free when positioning a database cursor to a non-existant
string key (and probably a few other situations with string keys).
This was reported with a patch as pybsddb sourceforge bug 1708868 by
jjjhhhlll at gmail.
........
r58386 | gregory.p.smith | 2007-10-09 00:19:11 -0700 (Tue, 09 Oct 2007) | 3 lines
Use the highest cPickle protocol in bsddb.dbshelve. This comes from
sourceforge pybsddb patch 1551443 by w_barnes.
........
r58394 | gregory.p.smith | 2007-10-09 11:26:02 -0700 (Tue, 09 Oct 2007) | 2 lines
remove another sleepycat reference
........
r58396 | kurt.kaiser | 2007-10-09 12:31:30 -0700 (Tue, 09 Oct 2007) | 3 lines
Allow interrupt only when executing user code in subprocess
Patch 1225 Tal Einat modified from IDLE-Spoon.
........
r58399 | brett.cannon | 2007-10-09 17:07:50 -0700 (Tue, 09 Oct 2007) | 5 lines
Remove file-level typedefs that were inconsistently used throughout the file.
Just move over to the public API names.
Closes issue1238.
........
r58401 | raymond.hettinger | 2007-10-09 17:26:46 -0700 (Tue, 09 Oct 2007) | 1 line
Accept Jim Jewett's api suggestion to use None instead of -1 to indicate unbounded deques.
........
r58403 | kurt.kaiser | 2007-10-09 17:55:40 -0700 (Tue, 09 Oct 2007) | 2 lines
Allow cursor color change w/o restart. Patch 1725576 Tal Einat.
........
r58404 | kurt.kaiser | 2007-10-09 18:06:47 -0700 (Tue, 09 Oct 2007) | 2 lines
show paste if > 80 columns. Patch 1659326 Tal Einat.
........
r58415 | thomas.heller | 2007-10-11 12:51:32 -0700 (Thu, 11 Oct 2007) | 5 lines
On OS X, use os.uname() instead of gestalt.sysv(...) to get the
operating system version. This allows to use ctypes when Python
was configured with --disable-toolbox-glue.
........
r58419 | neal.norwitz | 2007-10-11 20:01:01 -0700 (Thu, 11 Oct 2007) | 1 line
Get rid of warning about not being able to create an existing directory.
........
r58420 | neal.norwitz | 2007-10-11 20:01:30 -0700 (Thu, 11 Oct 2007) | 1 line
Get rid of warnings on a bunch of platforms by using a proper prototype.
........
r58421 | neal.norwitz | 2007-10-11 20:01:54 -0700 (Thu, 11 Oct 2007) | 4 lines
Get rid of compiler warning about retval being used (returned) without
being initialized. (gcc warning and Coverity 202)
........
r58422 | neal.norwitz | 2007-10-11 20:03:23 -0700 (Thu, 11 Oct 2007) | 1 line
Fix Coverity 168: Close the file before returning (exiting).
........
r58423 | neal.norwitz | 2007-10-11 20:04:18 -0700 (Thu, 11 Oct 2007) | 4 lines
Fix Coverity 180: Don't overallocate. We don't need structs, but pointers.
Also fix a memory leak.
........
r58424 | neal.norwitz | 2007-10-11 20:05:19 -0700 (Thu, 11 Oct 2007) | 5 lines
Fix Coverity 185-186: If the passed in FILE is NULL, uninitialized memory
would be accessed.
Will backport.
........
r58425 | neal.norwitz | 2007-10-11 20:52:34 -0700 (Thu, 11 Oct 2007) | 1 line
Get this module to compile with bsddb versions prior to 4.3
........
r58430 | martin.v.loewis | 2007-10-12 01:56:52 -0700 (Fri, 12 Oct 2007) | 3 lines
Bug #1216: Restore support for Visual Studio 2002.
Will backport to 2.5.
........
r58433 | raymond.hettinger | 2007-10-12 10:53:11 -0700 (Fri, 12 Oct 2007) | 1 line
Fix test of count.__repr__() to ignore the 'L' if the count is a long
........
r58434 | gregory.p.smith | 2007-10-12 11:44:06 -0700 (Fri, 12 Oct 2007) | 4 lines
Fixes http://bugs.python.org/issue1233 - bsddb.dbshelve.DBShelf.append
was useless due to inverted logic. Also adds a test case for RECNO dbs
to test_dbshelve.
........
r58445 | georg.brandl | 2007-10-13 06:20:03 -0700 (Sat, 13 Oct 2007) | 2 lines
Fix email example.
........
r58450 | gregory.p.smith | 2007-10-13 16:02:05 -0700 (Sat, 13 Oct 2007) | 2 lines
Fix an uncollectable reference leak in bsddb.db.DBShelf.append
........
r58453 | neal.norwitz | 2007-10-13 17:18:40 -0700 (Sat, 13 Oct 2007) | 8 lines
Let the O/S supply a port if none of the default ports can be used.
This should make the tests more robust at the expense of allowing
tests to be sloppier by not requiring them to cleanup after themselves.
(It will legitamitely help when running two test suites simultaneously
or if another process is already using one of the predefined ports.)
Also simplifies (slightLy) the exception handling elsewhere.
........
r58459 | neal.norwitz | 2007-10-14 11:30:21 -0700 (Sun, 14 Oct 2007) | 2 lines
Don't raise a string exception, they don't work anymore.
........
r58460 | neal.norwitz | 2007-10-14 11:40:37 -0700 (Sun, 14 Oct 2007) | 1 line
Use unittest for assertions
........
r58468 | armin.rigo | 2007-10-15 00:48:35 -0700 (Mon, 15 Oct 2007) | 2 lines
test_bigbits was not testing what it seemed to.
........
r58471 | guido.van.rossum | 2007-10-15 08:54:11 -0700 (Mon, 15 Oct 2007) | 3 lines
Change a PyErr_Print() into a PyErr_Clear(),
per discussion in issue 1031213.
........
r58500 | raymond.hettinger | 2007-10-16 12:18:30 -0700 (Tue, 16 Oct 2007) | 1 line
Improve error messages
........
r58506 | raymond.hettinger | 2007-10-16 14:28:32 -0700 (Tue, 16 Oct 2007) | 1 line
More docs, error messages, and tests
........
r58507 | andrew.kuchling | 2007-10-16 15:58:03 -0700 (Tue, 16 Oct 2007) | 1 line
Add items
........
r58508 | brett.cannon | 2007-10-16 16:24:06 -0700 (Tue, 16 Oct 2007) | 3 lines
Remove ``:const:`` notation on None in parameter list. Since the markup is not
rendered for parameters it just showed up as ``:const:`None` `` in the output.
........
r58509 | brett.cannon | 2007-10-16 16:26:45 -0700 (Tue, 16 Oct 2007) | 3 lines
Re-order some functions whose parameters differ between PyObject and const char
* so that they are next to each other.
........
r58522 | armin.rigo | 2007-10-17 11:46:37 -0700 (Wed, 17 Oct 2007) | 5 lines
Fix the overflow checking of list_repeat.
Introduce overflow checking into list_inplace_repeat.
Backport candidate, possibly.
........
r58530 | facundo.batista | 2007-10-17 20:16:03 -0700 (Wed, 17 Oct 2007) | 7 lines
Issue #1580738. When HTTPConnection reads the whole stream with read(),
it closes itself. When the stream is read in several calls to read(n),
it should behave in the same way if HTTPConnection knows where the end
of the stream is (through self.length). Added a test case for this
behaviour.
........
r58531 | facundo.batista | 2007-10-17 20:44:48 -0700 (Wed, 17 Oct 2007) | 3 lines
Issue 1289, just a typo.
........
r58532 | gregory.p.smith | 2007-10-18 00:56:54 -0700 (Thu, 18 Oct 2007) | 4 lines
cleanup test_dbtables to use mkdtemp. cleanup dbtables to pass txn as a
keyword argument whenever possible to avoid bugs and confusion. (dbtables.py
line 447 self.db.get using txn as a non-keyword was an actual bug due to this)
........
r58533 | gregory.p.smith | 2007-10-18 01:34:20 -0700 (Thu, 18 Oct 2007) | 4 lines
Fix a weird bug in dbtables: if it chose a random rowid string that contained
NULL bytes it would cause the database all sorts of problems in the future
leading to very strange random failures and corrupt dbtables.bsdTableDb dbs.
........
r58534 | gregory.p.smith | 2007-10-18 09:32:02 -0700 (Thu, 18 Oct 2007) | 3 lines
A cleaner fix than the one committed last night. Generate random rowids that
do not contain null bytes.
........
r58537 | gregory.p.smith | 2007-10-18 10:17:57 -0700 (Thu, 18 Oct 2007) | 2 lines
mention bsddb fixes.
........
r58538 | raymond.hettinger | 2007-10-18 14:13:06 -0700 (Thu, 18 Oct 2007) | 1 line
Remove useless warning
........
r58539 | gregory.p.smith | 2007-10-19 00:31:20 -0700 (Fri, 19 Oct 2007) | 2 lines
squelch the warning that this test is supposed to trigger.
........
r58542 | georg.brandl | 2007-10-19 05:32:39 -0700 (Fri, 19 Oct 2007) | 2 lines
Clarify wording for apply().
........
r58544 | mark.summerfield | 2007-10-19 05:48:17 -0700 (Fri, 19 Oct 2007) | 3 lines
Added a cross-ref to each other.
........
r58545 | georg.brandl | 2007-10-19 10:38:49 -0700 (Fri, 19 Oct 2007) | 2 lines
#1284: "S" means "seen", not unread.
........
r58548 | thomas.heller | 2007-10-19 11:11:41 -0700 (Fri, 19 Oct 2007) | 4 lines
Fix ctypes on 32-bit systems when Python is configured --with-system-ffi.
See also https://bugs.launchpad.net/bugs/72505.
Ported from release25-maint branch.
........
r58550 | facundo.batista | 2007-10-19 12:25:57 -0700 (Fri, 19 Oct 2007) | 8 lines
The constructor from tuple was way too permissive: it allowed bad
coefficient numbers, floats in the sign, and other details that
generated directly the wrong number in the best case, or triggered
misfunctionality in the alorithms.
Test cases added for these issues. Thanks Mark Dickinson.
........
r58559 | georg.brandl | 2007-10-20 06:22:53 -0700 (Sat, 20 Oct 2007) | 2 lines
Fix code being interpreted as a target.
........
r58561 | georg.brandl | 2007-10-20 06:36:24 -0700 (Sat, 20 Oct 2007) | 2 lines
Document new "cmdoption" directive.
........
r58562 | georg.brandl | 2007-10-20 08:21:22 -0700 (Sat, 20 Oct 2007) | 2 lines
Make a path more Unix-standardy.
........
r58564 | georg.brandl | 2007-10-20 10:51:39 -0700 (Sat, 20 Oct 2007) | 2 lines
Document new directive "envvar".
........
r58567 | georg.brandl | 2007-10-20 11:08:14 -0700 (Sat, 20 Oct 2007) | 6 lines
* Add new toplevel chapter, "Using Python." (how to install,
configure and setup python on different platforms -- at least
in theory.)
* Move the Python on Mac docs in that chapter.
* Add a new chapter about the command line invocation, by stargaming.
........
r58568 | georg.brandl | 2007-10-20 11:33:20 -0700 (Sat, 20 Oct 2007) | 2 lines
Change title, for now.
........
r58569 | georg.brandl | 2007-10-20 11:39:25 -0700 (Sat, 20 Oct 2007) | 2 lines
Add entry to ACKS.
........
r58570 | georg.brandl | 2007-10-20 12:05:45 -0700 (Sat, 20 Oct 2007) | 2 lines
Clarify -E docs.
........
r58571 | georg.brandl | 2007-10-20 12:08:36 -0700 (Sat, 20 Oct 2007) | 2 lines
Even more clarification.
........
r58572 | andrew.kuchling | 2007-10-20 12:25:37 -0700 (Sat, 20 Oct 2007) | 1 line
Fix protocol name
........
r58573 | andrew.kuchling | 2007-10-20 12:35:18 -0700 (Sat, 20 Oct 2007) | 1 line
Various items
........
r58574 | andrew.kuchling | 2007-10-20 12:39:35 -0700 (Sat, 20 Oct 2007) | 1 line
Use correct header line
........
r58576 | armin.rigo | 2007-10-21 02:14:15 -0700 (Sun, 21 Oct 2007) | 3 lines
Add a crasher for the long-standing issue with closing a file
while another thread uses it.
........
r58577 | georg.brandl | 2007-10-21 03:01:56 -0700 (Sun, 21 Oct 2007) | 2 lines
Remove duplicate crasher.
........
r58578 | georg.brandl | 2007-10-21 03:24:20 -0700 (Sun, 21 Oct 2007) | 2 lines
Unify "byte code" to "bytecode". Also sprinkle :term: markup for it.
........
r58579 | georg.brandl | 2007-10-21 03:32:54 -0700 (Sun, 21 Oct 2007) | 2 lines
Add markup to new function descriptions.
........
r58580 | georg.brandl | 2007-10-21 03:45:46 -0700 (Sun, 21 Oct 2007) | 2 lines
Add :term:s for descriptors.
........
r58581 | georg.brandl | 2007-10-21 03:46:24 -0700 (Sun, 21 Oct 2007) | 2 lines
Unify "file-descriptor" to "file descriptor".
........
r58582 | georg.brandl | 2007-10-21 03:52:38 -0700 (Sun, 21 Oct 2007) | 2 lines
Add :term: for generators.
........
r58583 | georg.brandl | 2007-10-21 05:10:28 -0700 (Sun, 21 Oct 2007) | 2 lines
Add :term:s for iterator.
........
r58584 | georg.brandl | 2007-10-21 05:15:05 -0700 (Sun, 21 Oct 2007) | 2 lines
Add :term:s for "new-style class".
........
r58588 | neal.norwitz | 2007-10-21 21:47:54 -0700 (Sun, 21 Oct 2007) | 1 line
Add Chris Monson so he can edit PEPs.
........
r58594 | guido.van.rossum | 2007-10-22 09:27:19 -0700 (Mon, 22 Oct 2007) | 4 lines
Issue #1307, patch by Derek Shockey.
When "MAIL" is received without args, an exception happens instead of
sending a 501 syntax error response.
........
r58598 | travis.oliphant | 2007-10-22 19:40:56 -0700 (Mon, 22 Oct 2007) | 1 line
Add phuang patch from Issue 708374 which adds offset parameter to mmap module.
........
r58601 | neal.norwitz | 2007-10-22 22:44:27 -0700 (Mon, 22 Oct 2007) | 2 lines
Bug #1313, fix typo (wrong variable name) in example.
........
r58609 | georg.brandl | 2007-10-23 11:21:35 -0700 (Tue, 23 Oct 2007) | 2 lines
Update Pygments version from externals.
........
r58618 | guido.van.rossum | 2007-10-23 12:25:41 -0700 (Tue, 23 Oct 2007) | 3 lines
Issue 1307 by Derek Shockey, fox the same bug for RCPT.
Neal: please backport!
........
r58620 | raymond.hettinger | 2007-10-23 13:37:41 -0700 (Tue, 23 Oct 2007) | 1 line
Shorter name for namedtuple()
........
r58621 | andrew.kuchling | 2007-10-23 13:55:47 -0700 (Tue, 23 Oct 2007) | 1 line
Update name
........
r58622 | raymond.hettinger | 2007-10-23 14:23:07 -0700 (Tue, 23 Oct 2007) | 1 line
Fixup news entry
........
r58623 | raymond.hettinger | 2007-10-23 18:28:33 -0700 (Tue, 23 Oct 2007) | 1 line
Optimize sum() for integer and float inputs.
........
r58624 | raymond.hettinger | 2007-10-23 19:05:51 -0700 (Tue, 23 Oct 2007) | 1 line
Fixup error return and add support for intermixed ints and floats/
........
r58628 | vinay.sajip | 2007-10-24 03:47:06 -0700 (Wed, 24 Oct 2007) | 1 line
Bug #1321: Fixed logic error in TimedRotatingFileHandler.__init__()
........
r58641 | facundo.batista | 2007-10-24 12:11:08 -0700 (Wed, 24 Oct 2007) | 4 lines
Issue 1290. CharacterData.__repr__ was constructing a string
in response that keeped having a non-ascii character.
........
r58643 | thomas.heller | 2007-10-24 12:50:45 -0700 (Wed, 24 Oct 2007) | 1 line
Added unittest for calling a function with paramflags (backport from py3k branch).
........
r58645 | matthias.klose | 2007-10-24 13:00:44 -0700 (Wed, 24 Oct 2007) | 2 lines
- Build using system ffi library on arm*-linux*.
........
r58651 | georg.brandl | 2007-10-24 14:40:38 -0700 (Wed, 24 Oct 2007) | 2 lines
Bug #1287: make os.environ.pop() work as expected.
........
r58652 | raymond.hettinger | 2007-10-24 19:26:58 -0700 (Wed, 24 Oct 2007) | 1 line
Missing DECREFs
........
r58653 | matthias.klose | 2007-10-24 23:37:24 -0700 (Wed, 24 Oct 2007) | 2 lines
- Build using system ffi library on arm*-linux*, pass --with-system-ffi to CONFIG_ARGS
........
r58655 | thomas.heller | 2007-10-25 12:47:32 -0700 (Thu, 25 Oct 2007) | 2 lines
ffi_type_longdouble may be already #defined.
See issue 1324.
........
r58656 | kurt.kaiser | 2007-10-25 15:43:45 -0700 (Thu, 25 Oct 2007) | 3 lines
Correct an ancient bug in an unused path by removing that path: register() is
now idempotent.
........
r58660 | kurt.kaiser | 2007-10-25 17:10:09 -0700 (Thu, 25 Oct 2007) | 4 lines
1. Add comments to provide top-level documentation.
2. Refactor to use more descriptive names.
3. Enhance tests in main().
........
r58675 | georg.brandl | 2007-10-26 11:30:41 -0700 (Fri, 26 Oct 2007) | 2 lines
Fix new pop() method on os.environ on ignorecase-platforms.
........
r58696 | neal.norwitz | 2007-10-27 15:32:21 -0700 (Sat, 27 Oct 2007) | 1 line
Update URL for Pygments. 0.8.1 is no longer available
........
r58697 | hyeshik.chang | 2007-10-28 04:19:02 -0700 (Sun, 28 Oct 2007) | 3 lines
- Add support for FreeBSD 8 which is recently forked from FreeBSD 7.
- Regenerate IN module for most recent maintenance tree of FreeBSD 6 and 7.
........
r58698 | hyeshik.chang | 2007-10-28 05:38:09 -0700 (Sun, 28 Oct 2007) | 2 lines
Enable platform-specific tweaks for FreeBSD 8 (exactly same to FreeBSD 7's yet)
........
r58700 | kurt.kaiser | 2007-10-28 12:03:59 -0700 (Sun, 28 Oct 2007) | 2 lines
Add confirmation dialog before printing. Patch 1717170 Tal Einat.
........
r58706 | guido.van.rossum | 2007-10-29 13:52:45 -0700 (Mon, 29 Oct 2007) | 3 lines
Patch 1353 by Jacob Winther.
Add mp4 mapping to mimetypes.py.
........
r58709 | guido.van.rossum | 2007-10-29 15:15:05 -0700 (Mon, 29 Oct 2007) | 6 lines
Backport fixes for the code that decodes octal escapes (and for PyString
also hex escapes) -- this was reaching beyond the end of the input string
buffer, even though it is not supposed to be \0-terminated.
This has no visible effect but is clearly the correct thing to do.
(In 3.0 it had a visible effect after removing ob_sstate from PyString.)
........
r58710 | kurt.kaiser | 2007-10-29 19:38:54 -0700 (Mon, 29 Oct 2007) | 7 lines
check in Tal Einat's update to tabpage.py
Patch 1612746
M configDialog.py
M NEWS.txt
AM tabbedpages.py
........
r58715 | georg.brandl | 2007-10-30 10:51:18 -0700 (Tue, 30 Oct 2007) | 2 lines
Use correct markup.
........
r58716 | georg.brandl | 2007-10-30 10:57:12 -0700 (Tue, 30 Oct 2007) | 2 lines
Make example about hiding None return values at the prompt clearer.
........
r58728 | neal.norwitz | 2007-10-30 23:33:20 -0700 (Tue, 30 Oct 2007) | 1 line
Fix some compiler warnings for signed comparisons on Unix and Windows.
........
r58731 | martin.v.loewis | 2007-10-31 10:19:33 -0700 (Wed, 31 Oct 2007) | 2 lines
Adding Christian Heimes.
........
r58737 | raymond.hettinger | 2007-10-31 14:57:58 -0700 (Wed, 31 Oct 2007) | 1 line
Clarify the reasons why pickle is almost always better than marshal
........
r58739 | raymond.hettinger | 2007-10-31 15:15:49 -0700 (Wed, 31 Oct 2007) | 1 line
Sets are marshalable.
........
2007-11-01 17:32:30 -03:00
|
|
|
source code before the :term:`bytecode` is generated, and provides for inspection of the
|
2007-08-15 11:28:22 -03:00
|
|
|
parse tree for information gathering purposes. Two examples are presented. The
|
|
|
|
simple example demonstrates emulation of the :func:`compile` built-in function
|
|
|
|
and the complex example shows the use of a parse tree for information discovery.
|
|
|
|
|
|
|
|
|
|
|
|
Emulation of :func:`compile`
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
While many useful operations may take place between parsing and bytecode
|
|
|
|
generation, the simplest operation is to do nothing. For this purpose, using
|
|
|
|
the :mod:`parser` module to produce an intermediate data structure is equivalent
|
|
|
|
to the code ::
|
|
|
|
|
|
|
|
>>> code = compile('a + 5', 'file.py', 'eval')
|
|
|
|
>>> a = 5
|
|
|
|
>>> eval(code)
|
|
|
|
10
|
|
|
|
|
|
|
|
The equivalent operation using the :mod:`parser` module is somewhat longer, and
|
|
|
|
allows the intermediate internal parse tree to be retained as an AST object::
|
|
|
|
|
|
|
|
>>> import parser
|
|
|
|
>>> ast = parser.expr('a + 5')
|
|
|
|
>>> code = ast.compile('file.py')
|
|
|
|
>>> a = 5
|
|
|
|
>>> eval(code)
|
|
|
|
10
|
|
|
|
|
|
|
|
An application which needs both AST and code objects can package this code into
|
|
|
|
readily available functions::
|
|
|
|
|
|
|
|
import parser
|
|
|
|
|
|
|
|
def load_suite(source_string):
|
|
|
|
ast = parser.suite(source_string)
|
|
|
|
return ast, ast.compile()
|
|
|
|
|
|
|
|
def load_expression(source_string):
|
|
|
|
ast = parser.expr(source_string)
|
|
|
|
return ast, ast.compile()
|
|
|
|
|
|
|
|
|
|
|
|
Information Discovery
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
.. index::
|
|
|
|
single: string; documentation
|
|
|
|
single: docstrings
|
|
|
|
|
|
|
|
Some applications benefit from direct access to the parse tree. The remainder
|
|
|
|
of this section demonstrates how the parse tree provides access to module
|
|
|
|
documentation defined in docstrings without requiring that the code being
|
|
|
|
examined be loaded into a running interpreter via :keyword:`import`. This can
|
|
|
|
be very useful for performing analyses of untrusted code.
|
|
|
|
|
|
|
|
Generally, the example will demonstrate how the parse tree may be traversed to
|
|
|
|
distill interesting information. Two functions and a set of classes are
|
|
|
|
developed which provide programmatic access to high level function and class
|
|
|
|
definitions provided by a module. The classes extract information from the
|
|
|
|
parse tree and provide access to the information at a useful semantic level, one
|
|
|
|
function provides a simple low-level pattern matching capability, and the other
|
|
|
|
function defines a high-level interface to the classes by handling file
|
|
|
|
operations on behalf of the caller. All source files mentioned here which are
|
|
|
|
not part of the Python installation are located in the :file:`Demo/parser/`
|
|
|
|
directory of the distribution.
|
|
|
|
|
|
|
|
The dynamic nature of Python allows the programmer a great deal of flexibility,
|
|
|
|
but most modules need only a limited measure of this when defining classes,
|
|
|
|
functions, and methods. In this example, the only definitions that will be
|
|
|
|
considered are those which are defined in the top level of their context, e.g.,
|
|
|
|
a function defined by a :keyword:`def` statement at column zero of a module, but
|
|
|
|
not a function defined within a branch of an :keyword:`if` ... :keyword:`else`
|
|
|
|
construct, though there are some good reasons for doing so in some situations.
|
|
|
|
Nesting of definitions will be handled by the code developed in the example.
|
|
|
|
|
|
|
|
To construct the upper-level extraction methods, we need to know what the parse
|
|
|
|
tree structure looks like and how much of it we actually need to be concerned
|
|
|
|
about. Python uses a moderately deep parse tree so there are a large number of
|
|
|
|
intermediate nodes. It is important to read and understand the formal grammar
|
|
|
|
used by Python. This is specified in the file :file:`Grammar/Grammar` in the
|
|
|
|
distribution. Consider the simplest case of interest when searching for
|
|
|
|
docstrings: a module consisting of a docstring and nothing else. (See file
|
|
|
|
:file:`docstring.py`.) ::
|
|
|
|
|
|
|
|
"""Some documentation.
|
|
|
|
"""
|
|
|
|
|
|
|
|
Using the interpreter to take a look at the parse tree, we find a bewildering
|
|
|
|
mass of numbers and parentheses, with the documentation buried deep in nested
|
|
|
|
tuples. ::
|
|
|
|
|
|
|
|
>>> import parser
|
|
|
|
>>> import pprint
|
|
|
|
>>> ast = parser.suite(open('docstring.py').read())
|
|
|
|
>>> tup = ast.totuple()
|
|
|
|
>>> pprint.pprint(tup)
|
|
|
|
(257,
|
|
|
|
(264,
|
|
|
|
(265,
|
|
|
|
(266,
|
|
|
|
(267,
|
|
|
|
(307,
|
|
|
|
(287,
|
|
|
|
(288,
|
|
|
|
(289,
|
|
|
|
(290,
|
|
|
|
(292,
|
|
|
|
(293,
|
|
|
|
(294,
|
|
|
|
(295,
|
|
|
|
(296,
|
|
|
|
(297,
|
|
|
|
(298,
|
|
|
|
(299,
|
|
|
|
(300, (3, '"""Some documentation.\n"""'))))))))))))))))),
|
|
|
|
(4, ''))),
|
|
|
|
(4, ''),
|
|
|
|
(0, ''))
|
|
|
|
|
|
|
|
The numbers at the first element of each node in the tree are the node types;
|
|
|
|
they map directly to terminal and non-terminal symbols in the grammar.
|
|
|
|
Unfortunately, they are represented as integers in the internal representation,
|
|
|
|
and the Python structures generated do not change that. However, the
|
|
|
|
:mod:`symbol` and :mod:`token` modules provide symbolic names for the node types
|
|
|
|
and dictionaries which map from the integers to the symbolic names for the node
|
|
|
|
types.
|
|
|
|
|
|
|
|
In the output presented above, the outermost tuple contains four elements: the
|
|
|
|
integer ``257`` and three additional tuples. Node type ``257`` has the symbolic
|
|
|
|
name :const:`file_input`. Each of these inner tuples contains an integer as the
|
|
|
|
first element; these integers, ``264``, ``4``, and ``0``, represent the node
|
|
|
|
types :const:`stmt`, :const:`NEWLINE`, and :const:`ENDMARKER`, respectively.
|
|
|
|
Note that these values may change depending on the version of Python you are
|
|
|
|
using; consult :file:`symbol.py` and :file:`token.py` for details of the
|
|
|
|
mapping. It should be fairly clear that the outermost node is related primarily
|
|
|
|
to the input source rather than the contents of the file, and may be disregarded
|
|
|
|
for the moment. The :const:`stmt` node is much more interesting. In
|
|
|
|
particular, all docstrings are found in subtrees which are formed exactly as
|
|
|
|
this node is formed, with the only difference being the string itself. The
|
|
|
|
association between the docstring in a similar tree and the defined entity
|
|
|
|
(class, function, or module) which it describes is given by the position of the
|
|
|
|
docstring subtree within the tree defining the described structure.
|
|
|
|
|
|
|
|
By replacing the actual docstring with something to signify a variable component
|
|
|
|
of the tree, we allow a simple pattern matching approach to check any given
|
|
|
|
subtree for equivalence to the general pattern for docstrings. Since the
|
|
|
|
example demonstrates information extraction, we can safely require that the tree
|
|
|
|
be in tuple form rather than list form, allowing a simple variable
|
|
|
|
representation to be ``['variable_name']``. A simple recursive function can
|
|
|
|
implement the pattern matching, returning a Boolean and a dictionary of variable
|
|
|
|
name to value mappings. (See file :file:`example.py`.) ::
|
|
|
|
|
|
|
|
def match(pattern, data, vars=None):
|
|
|
|
if vars is None:
|
|
|
|
vars = {}
|
2007-08-28 03:10:19 -03:00
|
|
|
if isinstance(pattern, list):
|
2007-08-15 11:28:22 -03:00
|
|
|
vars[pattern[0]] = data
|
2007-08-28 03:10:19 -03:00
|
|
|
return True, vars
|
|
|
|
if not instance(pattern, tuple):
|
2007-08-15 11:28:22 -03:00
|
|
|
return (pattern == data), vars
|
|
|
|
if len(data) != len(pattern):
|
2007-08-28 03:10:19 -03:00
|
|
|
return False, vars
|
|
|
|
for pattern, data in zip(pattern, data):
|
2007-08-15 11:28:22 -03:00
|
|
|
same, vars = match(pattern, data, vars)
|
|
|
|
if not same:
|
|
|
|
break
|
|
|
|
return same, vars
|
|
|
|
|
|
|
|
Using this simple representation for syntactic variables and the symbolic node
|
|
|
|
types, the pattern for the candidate docstring subtrees becomes fairly readable.
|
|
|
|
(See file :file:`example.py`.) ::
|
|
|
|
|
|
|
|
import symbol
|
|
|
|
import token
|
|
|
|
|
|
|
|
DOCSTRING_STMT_PATTERN = (
|
|
|
|
symbol.stmt,
|
|
|
|
(symbol.simple_stmt,
|
|
|
|
(symbol.small_stmt,
|
|
|
|
(symbol.expr_stmt,
|
|
|
|
(symbol.testlist,
|
|
|
|
(symbol.test,
|
|
|
|
(symbol.and_test,
|
|
|
|
(symbol.not_test,
|
|
|
|
(symbol.comparison,
|
|
|
|
(symbol.expr,
|
|
|
|
(symbol.xor_expr,
|
|
|
|
(symbol.and_expr,
|
|
|
|
(symbol.shift_expr,
|
|
|
|
(symbol.arith_expr,
|
|
|
|
(symbol.term,
|
|
|
|
(symbol.factor,
|
|
|
|
(symbol.power,
|
|
|
|
(symbol.atom,
|
|
|
|
(token.STRING, ['docstring'])
|
|
|
|
)))))))))))))))),
|
|
|
|
(token.NEWLINE, '')
|
|
|
|
))
|
|
|
|
|
|
|
|
Using the :func:`match` function with this pattern, extracting the module
|
|
|
|
docstring from the parse tree created previously is easy::
|
|
|
|
|
|
|
|
>>> found, vars = match(DOCSTRING_STMT_PATTERN, tup[1])
|
|
|
|
>>> found
|
2007-08-28 03:10:19 -03:00
|
|
|
True
|
2007-08-15 11:28:22 -03:00
|
|
|
>>> vars
|
|
|
|
{'docstring': '"""Some documentation.\n"""'}
|
|
|
|
|
|
|
|
Once specific data can be extracted from a location where it is expected, the
|
|
|
|
question of where information can be expected needs to be answered. When
|
|
|
|
dealing with docstrings, the answer is fairly simple: the docstring is the first
|
|
|
|
:const:`stmt` node in a code block (:const:`file_input` or :const:`suite` node
|
|
|
|
types). A module consists of a single :const:`file_input` node, and class and
|
|
|
|
function definitions each contain exactly one :const:`suite` node. Classes and
|
|
|
|
functions are readily identified as subtrees of code block nodes which start
|
|
|
|
with ``(stmt, (compound_stmt, (classdef, ...`` or ``(stmt, (compound_stmt,
|
|
|
|
(funcdef, ...``. Note that these subtrees cannot be matched by :func:`match`
|
|
|
|
since it does not support multiple sibling nodes to match without regard to
|
|
|
|
number. A more elaborate matching function could be used to overcome this
|
|
|
|
limitation, but this is sufficient for the example.
|
|
|
|
|
|
|
|
Given the ability to determine whether a statement might be a docstring and
|
|
|
|
extract the actual string from the statement, some work needs to be performed to
|
|
|
|
walk the parse tree for an entire module and extract information about the names
|
|
|
|
defined in each context of the module and associate any docstrings with the
|
|
|
|
names. The code to perform this work is not complicated, but bears some
|
|
|
|
explanation.
|
|
|
|
|
|
|
|
The public interface to the classes is straightforward and should probably be
|
|
|
|
somewhat more flexible. Each "major" block of the module is described by an
|
|
|
|
object providing several methods for inquiry and a constructor which accepts at
|
|
|
|
least the subtree of the complete parse tree which it represents. The
|
|
|
|
:class:`ModuleInfo` constructor accepts an optional *name* parameter since it
|
|
|
|
cannot otherwise determine the name of the module.
|
|
|
|
|
|
|
|
The public classes include :class:`ClassInfo`, :class:`FunctionInfo`, and
|
|
|
|
:class:`ModuleInfo`. All objects provide the methods :meth:`get_name`,
|
|
|
|
:meth:`get_docstring`, :meth:`get_class_names`, and :meth:`get_class_info`. The
|
|
|
|
:class:`ClassInfo` objects support :meth:`get_method_names` and
|
|
|
|
:meth:`get_method_info` while the other classes provide
|
|
|
|
:meth:`get_function_names` and :meth:`get_function_info`.
|
|
|
|
|
|
|
|
Within each of the forms of code block that the public classes represent, most
|
|
|
|
of the required information is in the same form and is accessed in the same way,
|
|
|
|
with classes having the distinction that functions defined at the top level are
|
|
|
|
referred to as "methods." Since the difference in nomenclature reflects a real
|
|
|
|
semantic distinction from functions defined outside of a class, the
|
|
|
|
implementation needs to maintain the distinction. Hence, most of the
|
|
|
|
functionality of the public classes can be implemented in a common base class,
|
|
|
|
:class:`SuiteInfoBase`, with the accessors for function and method information
|
|
|
|
provided elsewhere. Note that there is only one class which represents function
|
|
|
|
and method information; this parallels the use of the :keyword:`def` statement
|
|
|
|
to define both types of elements.
|
|
|
|
|
|
|
|
Most of the accessor functions are declared in :class:`SuiteInfoBase` and do not
|
|
|
|
need to be overridden by subclasses. More importantly, the extraction of most
|
|
|
|
information from a parse tree is handled through a method called by the
|
|
|
|
:class:`SuiteInfoBase` constructor. The example code for most of the classes is
|
|
|
|
clear when read alongside the formal grammar, but the method which recursively
|
|
|
|
creates new information objects requires further examination. Here is the
|
|
|
|
relevant part of the :class:`SuiteInfoBase` definition from :file:`example.py`::
|
|
|
|
|
|
|
|
class SuiteInfoBase:
|
|
|
|
_docstring = ''
|
|
|
|
_name = ''
|
|
|
|
|
|
|
|
def __init__(self, tree = None):
|
|
|
|
self._class_info = {}
|
|
|
|
self._function_info = {}
|
|
|
|
if tree:
|
|
|
|
self._extract_info(tree)
|
|
|
|
|
|
|
|
def _extract_info(self, tree):
|
|
|
|
# extract docstring
|
|
|
|
if len(tree) == 2:
|
|
|
|
found, vars = match(DOCSTRING_STMT_PATTERN[1], tree[1])
|
|
|
|
else:
|
|
|
|
found, vars = match(DOCSTRING_STMT_PATTERN, tree[3])
|
|
|
|
if found:
|
|
|
|
self._docstring = eval(vars['docstring'])
|
|
|
|
# discover inner definitions
|
|
|
|
for node in tree[1:]:
|
|
|
|
found, vars = match(COMPOUND_STMT_PATTERN, node)
|
|
|
|
if found:
|
|
|
|
cstmt = vars['compound']
|
|
|
|
if cstmt[0] == symbol.funcdef:
|
|
|
|
name = cstmt[2][1]
|
|
|
|
self._function_info[name] = FunctionInfo(cstmt)
|
|
|
|
elif cstmt[0] == symbol.classdef:
|
|
|
|
name = cstmt[2][1]
|
|
|
|
self._class_info[name] = ClassInfo(cstmt)
|
|
|
|
|
|
|
|
After initializing some internal state, the constructor calls the
|
|
|
|
:meth:`_extract_info` method. This method performs the bulk of the information
|
|
|
|
extraction which takes place in the entire example. The extraction has two
|
|
|
|
distinct phases: the location of the docstring for the parse tree passed in, and
|
|
|
|
the discovery of additional definitions within the code block represented by the
|
|
|
|
parse tree.
|
|
|
|
|
|
|
|
The initial :keyword:`if` test determines whether the nested suite is of the
|
|
|
|
"short form" or the "long form." The short form is used when the code block is
|
|
|
|
on the same line as the definition of the code block, as in ::
|
|
|
|
|
|
|
|
def square(x): "Square an argument."; return x ** 2
|
|
|
|
|
|
|
|
while the long form uses an indented block and allows nested definitions::
|
|
|
|
|
|
|
|
def make_power(exp):
|
|
|
|
"Make a function that raises an argument to the exponent `exp'."
|
|
|
|
def raiser(x, y=exp):
|
|
|
|
return x ** y
|
|
|
|
return raiser
|
|
|
|
|
|
|
|
When the short form is used, the code block may contain a docstring as the
|
|
|
|
first, and possibly only, :const:`small_stmt` element. The extraction of such a
|
|
|
|
docstring is slightly different and requires only a portion of the complete
|
|
|
|
pattern used in the more common case. As implemented, the docstring will only
|
|
|
|
be found if there is only one :const:`small_stmt` node in the
|
|
|
|
:const:`simple_stmt` node. Since most functions and methods which use the short
|
|
|
|
form do not provide a docstring, this may be considered sufficient. The
|
|
|
|
extraction of the docstring proceeds using the :func:`match` function as
|
|
|
|
described above, and the value of the docstring is stored as an attribute of the
|
|
|
|
:class:`SuiteInfoBase` object.
|
|
|
|
|
|
|
|
After docstring extraction, a simple definition discovery algorithm operates on
|
|
|
|
the :const:`stmt` nodes of the :const:`suite` node. The special case of the
|
|
|
|
short form is not tested; since there are no :const:`stmt` nodes in the short
|
|
|
|
form, the algorithm will silently skip the single :const:`simple_stmt` node and
|
|
|
|
correctly not discover any nested definitions.
|
|
|
|
|
|
|
|
Each statement in the code block is categorized as a class definition, function
|
|
|
|
or method definition, or something else. For the definition statements, the
|
|
|
|
name of the element defined is extracted and a representation object appropriate
|
|
|
|
to the definition is created with the defining subtree passed as an argument to
|
|
|
|
the constructor. The representation objects are stored in instance variables
|
|
|
|
and may be retrieved by name using the appropriate accessor methods.
|
|
|
|
|
|
|
|
The public classes provide any accessors required which are more specific than
|
|
|
|
those provided by the :class:`SuiteInfoBase` class, but the real extraction
|
|
|
|
algorithm remains common to all forms of code blocks. A high-level function can
|
|
|
|
be used to extract the complete set of information from a source file. (See
|
|
|
|
file :file:`example.py`.) ::
|
|
|
|
|
|
|
|
def get_docs(fileName):
|
|
|
|
import os
|
|
|
|
import parser
|
|
|
|
|
|
|
|
source = open(fileName).read()
|
|
|
|
basename = os.path.basename(os.path.splitext(fileName)[0])
|
|
|
|
ast = parser.suite(source)
|
|
|
|
return ModuleInfo(ast.totuple(), basename)
|
|
|
|
|
|
|
|
This provides an easy-to-use interface to the documentation of a module. If
|
|
|
|
information is required which is not extracted by the code of this example, the
|
|
|
|
code may be extended at clearly defined points to provide additional
|
|
|
|
capabilities.
|
|
|
|
|