                          Python 2.3 Quick Reference


 25 Jan 2003  upgraded by Raymond Hettinger for Python 2.3
 16 May 2001  upgraded by Richard Gruet and Simon Brunning for Python 2.0
 2000/07/18  upgraded by Richard Gruet, rgruet@intraware.com for Python 1.5.2
from V1.3 ref
1995/10/30, by Chris Hoffmann, choffman@vicorp.com

Based on:
    Python Bestiary, Author: Ken Manheimer, ken.manheimer@nist.gov
    Python manuals, Authors: Guido van Rossum and Fred Drake
    What's new in Python 2.0, Authors: A.M. Kuchling and Moshe Zadka
    python-mode.el, Author: Tim Peters, tim_one@email.msn.com

    and the readers of comp.lang.python

Python's nest: http://www.python.org     Developement: http://
python.sourceforge.net/    ActivePython : http://www.ActiveState.com/ASPN/
Python/
newsgroup: comp.lang.python  Help desk: help@python.org
Resources: http://starship.python.net/
           http://www.vex.net/parnassus/
           http://aspn.activestate.com/ASPN/Cookbook/Python
FAQ:       http://www.python.org/cgi-bin/faqw.py
Full documentation: http://www.python.org/doc/
Excellent reference books:
           Python Essential Reference by David Beazley (New Riders)
           Python Pocket Reference by Mark Lutz (O'Reilly)


Invocation Options

python [-diOStuUvxX?] [-c command | script | - ] [args]

                              Invocation Options
Option                                  Effect
-c cmd  program passed in as string (terminates option list)
-d      Outputs parser debugging information (also PYTHONDEBUG=x)
-E      ignore environment variables (such as PYTHONPATH)
-h      print this help message and exit
-i      Inspect interactively after running script (also PYTHONINSPECT=x) and
        force prompts, even if stdin appears not to be a terminal
-O      optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)
-OO     remove doc-strings in addition to the -O optimizations
-Q arg  division options: -Qold (default), -Qwarn, -Qwarnall, -Qnew
-S      Don't perform 'import site' on initialization
-t      Issue warnings about inconsistent tab usage (-tt: issue errors)
-u      Unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x).
-v      Verbose (trace import statements) (also PYTHONVERBOSE=x)
-W arg : warning control (arg is action:message:category:module:lineno)
-x      Skip first line of source, allowing use of non-unix Forms of #!cmd
-?      Help!
-c      Specify the command to execute (see next section). This terminates the
command option list (following options are passed as arguments to the command).
        the name of a python file (.py) to execute read from stdin.
script  Anything afterward is passed as options to python script or command,
        not interpreted as an option to interpreter itself.
args    passed to script or command (in sys.argv[1:])
        If no script or command, Python enters interactive mode.

  * Available IDEs in std distrib: IDLE (tkinter based, portable), Pythonwin
    (Windows).



Environment variables

                             Environment variables
    Variable                                 Effect
PYTHONHOME       Alternate prefix directory (or prefix;exec_prefix). The
                 default module search path uses prefix/lib
                 Augments the default search path for module files. The format
                 is the same as the shell's $PATH: one or more directory
                 pathnames separated by ':' or ';' without spaces around
                 (semi-)colons!
PYTHONPATH       On Windows first search for Registry key HKEY_LOCAL_MACHINE\
                 Software\Python\PythonCore\x.y\PythonPath (default value). You
                 may also define a key named after your application with a
                 default string value giving the root directory path of your
                 app.
                 If this is the name of a readable file, the Python commands in
PYTHONSTARTUP    that file are executed before the first prompt is displayed in
                 interactive mode (no default).
PYTHONDEBUG      If non-empty, same as -d option
PYTHONINSPECT    If non-empty, same as -i option
PYTHONSUPPRESS   If non-empty, same as -s option
PYTHONUNBUFFERED If non-empty, same as -u option
PYTHONVERBOSE    If non-empty, same as -v option
PYTHONCASEOK     If non-empty, ignore case in file/module names (imports)




Notable lexical entities

Keywords

    and       del       for       is        raise
    assert    elif      from      lambda    return
    break     else      global    not       try
    class     except    if        or        while
    continue  exec      import    pass      yield
    def       finally   in        print

  * (list of keywords in std module: keyword)
  * Illegitimate Tokens (only valid in strings): @ $ ?
  * A statement must all be on a single line. To break a statement over
    multiple lines use "\", as with the C preprocessor.
    Exception: can always break when inside any (), [], or {} pair, or in
    triple-quoted strings.
  * More than one statement can appear on a line if they are separated with
    semicolons (";").
  * Comments start with "#" and continue to end of line.

Identifiers

        (letter | "_")  (letter | digit | "_")*

  * Python identifiers keywords, attributes, etc. are case-sensitive.
  * Special forms: _ident (not imported by 'from module import *'); __ident__
    (system defined name);
               __ident (class-private name mangling)

Strings

    "a string enclosed by double quotes"
    'another string delimited by single quotes and with a " inside'
    '''a string containing embedded newlines and quote (') marks, can be
    delimited with triple quotes.'''
    """ may also use 3- double quotes as delimiters """
    u'a unicode string'   U"Another unicode string"
    r'a raw string where \ are kept (literalized): handy for regular
    expressions and windows paths!'
    R"another raw string"    -- raw strings cannot end with a \
    ur'a unicode raw string'   UR"another raw unicode"

        Use \ at end of line to continue a string on next line.
        adjacent strings are concatened, e.g. 'Monty' ' Python' is the same as
        'Monty Python'.
        u'hello' + ' world'  --> u'hello world'   (coerced to unicode)

    String Literal Escapes

     \newline  Ignored (escape newline)
     \\ Backslash (\)        \e Escape (ESC)        \v Vertical Tab (VT)
     \' Single quote (')     \f Formfeed (FF)       \OOO char with octal value OOO
     \" Double quote (")     \n Linefeed (LF)
     \a Bell (BEL)           \r Carriage Return (CR) \xHH  char with hex value HH
     \b Backspace (BS)       \t Horizontal Tab (TAB)
     \uHHHH  unicode char with hex value HHHH, can only be used in unicode string
     \UHHHHHHHH  unicode char with hex value HHHHHHHH, can only be used in unicode string
     \AnyOtherChar is left as-is

  * NUL byte (\000) is NOT an end-of-string marker; NULs may be embedded in
    strings.
  * Strings (and tuples) are immutable: they cannot be modified.

Numbers

    Decimal integer: 1234, 1234567890546378940L        (or l)
    Octal integer: 0177, 0177777777777777777 (begin with a 0)
    Hex integer: 0xFF, 0XFFFFffffFFFFFFFFFF (begin with 0x or 0X)
    Long integer (unlimited precision): 1234567890123456
    Float (double precision): 3.14e-10, .001, 10., 1E3
    Complex: 1J, 2+3J, 4+5j (ends with J or j, + separates (float) real and
    imaginary parts)

Sequences

  * String of length 0, 1, 2 (see above)
    '', '1', "12", 'hello\n'
  * Tuple of length 0, 1, 2, etc:
    () (1,) (1,2)     # parentheses are optional if len > 0
  * List of length 0, 1, 2, etc:
    [] [1] [1,2]

Indexing is 0-based. Negative indices (usually) mean count backwards from end
of sequence.

Sequence slicing [starting-at-index : but-less-than-index]. Start defaults to
'0'; End defaults to 'sequence-length'.

a = (0,1,2,3,4,5,6,7)
    a[3] ==> 3
    a[-1] ==> 7
    a[2:4] ==> (2, 3)
    a[1:] ==> (1, 2, 3, 4, 5, 6, 7)
    a[:3] ==> (0, 1, 2)
    a[:] ==> (0,1,2,3,4,5,6,7)  # makes a copy of the sequence.

Dictionaries (Mappings)

    {}                              # Zero length empty dictionary
    {1 : 'first'}                   # Dictionary with one (key, value) pair
    {1 : 'first',  'next': 'second'}
    dict([('one',1),('two',2)])     # Construct a dict from an item list
    dict('one'=1, 'two'=2)          # Construct a dict using keyword args
    dict.fromkeys(['one', 'keys'])  # Construct a dict from a sequence

Operators and their evaluation order

                     Operators and their evaluation order
Highest             Operator                             Comment
        (...) [...] {...} `...`           Tuple, list & dict. creation; string
                                          conv.
        s[i]  s[i:j]  s.attr f(...)       indexing & slicing; attributes, fct
                                          calls
        +x, -x, ~x                        Unary operators
        x**y                              Power
        x*y  x/y  x%y x//y                mult, division, modulo, floor division
        x+y  x-y                          addition, substraction
        x<<y   x>>y                       Bit shifting
        x&y                               Bitwise and
        x^y                               Bitwise exclusive or
        x|y                               Bitwise or
        x<y  x<=y  x>y  x>=y  x==y x!=y   Comparison,
        x<>y                              identity,
        x is y   x is not y               membership
        x in s   x not in s
        not x                             boolean negation
        x and y                           boolean and
        x or y                            boolean or
Lowest  lambda args: expr                 anonymous function

Alternate names are defined in module operator (e.g. __add__ and add for +)
Most operators are overridable.

Many binary operators also support augmented assignment:
        x += 1                            # Same as x = x + 1


Basic Types and Their Operations

Comparisons (defined between *any* types)

               Comparisons
Comparison         Meaning          Notes
<          strictly less than        (1)
<=         less than or equal to
>          strictly greater than
>=         greater than or equal to
==         equal to
!= or <>   not equal to
is         object identity           (2)
is not     negated object identity   (2)

Notes :
    Comparison behavior can be overridden for a given class by defining special
method __cmp__.
    The above comparisions return True or False which are of type bool
(a subclass of int) and behave exactly as 1 or 0 except for their type and
that they print as True or False instead of 1 or 0.
    (1) X < Y < Z < W has expected meaning, unlike C
    (2) Compare object identities (i.e. id(object)), not object values.

Boolean values and operators

                         Boolean values and operators
              Value or Operator                         Returns           Notes
None, numeric zeros, empty sequences and      False
mappings
all other values                              True
not x                                         True if x is False, else
                                              True
x or y                                        if x is False then y, else   (1)
                                              x
x and y                                       if x is False then x, else   (1)
                                              y

Notes :
    Truth testing behavior can be overridden for a given class by defining
special method __nonzero__.
    (1) Evaluate second arg only if necessary to determine outcome.

None

    None is used as default return value on functions. Built-in single object
    with type NoneType.
    Input that evaluates to None does not print when running Python
    interactively.

Numeric types

Floats, integers and long integers.

    Floats are implemented with C doubles.
    Integers are implemented with C longs.
    Long integers have unlimited size (only limit is system resources)

Operators on all numeric types

           Operators on all numeric types
 Operation                    Result
abs(x)       the absolute value of x
int(x)       x converted to integer
long(x)      x converted to long integer
float(x)     x converted to floating point
-x           x negated
+x           x unchanged
x + y        the sum of x and y
x - y        difference of x and y
x * y        product of x and y
x / y        quotient of x and y
x % y        remainder of x / y
divmod(x, y) the tuple (x/y, x%y)
x ** y       x to the power y (the same as pow(x, y))

Bit operators on integers and long integers

              Bit operators
Operation             >Result
~x        the bits of x inverted
x ^ y     bitwise exclusive or of x and y
x & y     bitwise and of x and y
x | y     bitwise or of x and y
x << n    x shifted left by n bits
x >> n    x shifted right by n bits

Complex Numbers

  * represented as a pair of machine-level double precision floating point
    numbers.
  * The real and imaginary value of a complex number z can be retrieved through
    the attributes z.real and z.imag.

Numeric exceptions

TypeError
    raised on application of arithmetic operation to non-number
OverflowError
     numeric bounds exceeded
ZeroDivisionError
     raised when zero second argument of div or modulo op
FloatingPointError
     raised when a floating point operation fails

Operations on all sequence types (lists, tuples, strings)

                Operations on all sequence types
Operation                     Result                     Notes
x in s     True if an item of s is equal to x, else False
x not in s False if an item of s is equal to x, else True
for x in s: loops over the sequence
s + t      the concatenation of s and t
s * n, n*s n copies of s concatenated
s[i]       i'th item of s, origin 0                       (1)
s[i:j]     slice of s from i (included) to j (excluded) (1), (2)
len(s)     length of s
min(s)     smallest item of s
max(s)     largest item of (s)
iter(s)    returns an iterator over s.  iterators define __iter__ and next()

Notes :
    (1) if i or j is negative, the index is relative to the end of the string,
ie len(s)+ i or len(s)+j is
         substituted. But note that -0 is still 0.
    (2) The slice of s from i to j is defined as the sequence of items with
index k such that i <= k < j.
          If i or j is greater than len(s), use len(s). If i is omitted, use
len(s). If i is greater than or
          equal to j, the slice is empty.

Operations on mutable (=modifiable) sequences (lists)

                 Operations on mutable sequences
   Operation                      Result                   Notes
s[i] =x          item i of s is replaced by x
s[i:j] = t       slice of s from i to j is replaced by t
del s[i:j]       same as s[i:j] = []
s.append(x)      same as s[len(s) : len(s)] = [x]
s.count(x)       return number of i's for which s[i] == x
s.extend(x)      same as s[len(s):len(s)]= x
s.index(x)       return smallest i such that s[i] == x      (1)
s.insert(i, x)   same as s[i:i] = [x] if i >= 0
s.pop([i])       same as x = s[i]; del s[i]; return x       (4)
s.remove(x)      same as del s[s.index(x)]                  (1)
s.reverse()      reverse the items of s in place            (3)
s.sort([cmpFct]) sort the items of s in place             (2), (3)

Notes :
    (1) raise a ValueError exception when x is not found in s (i.e. out of
range).
     (2) The sort() method takes an optional argument specifying a comparison
fct of 2 arguments (list items) which should
          return -1, 0, or 1 depending on whether the 1st argument is
considered smaller than, equal to, or larger than the 2nd
          argument. Note that this slows the sorting process down considerably.
     (3) The sort() and reverse() methods modify the list in place for economy
of space when sorting or reversing a large list.
           They don't return the sorted or reversed list to remind you of this
side effect.
     (4) [New 1.5.2] The optional  argument i defaults to -1, so that by default the last
item is removed and returned.



Operations on mappings (dictionaries)

                         Operations on mappings
        Operation                          Result                  Notes
len(d)                     the number of items in d
d[k]                       the item of d with key k                 (1)
d[k] = x                   set d[k] to x
del d[k]                   remove d[k] from d                       (1)
d.clear()                  remove all items from d
d.copy()                   a shallow copy of d
d.get(k,defaultval)        the item of d with key k                 (4)
d.has_key(k)               True if d has key k, else False
d.items()                  a copy of d's list of (key, item) pairs  (2)
d.iteritems()              an iterator over (key, value) pairs      (7)
d.iterkeys()               an iterator over the keys of d           (7)
d.itervalues()             an iterator over the values of d         (7)
d.keys()                   a copy of d's list of keys               (2)
d1.update(d2)              for k, v in d2.items(): d1[k] = v        (3)
d.values()                 a copy of d's list of values             (2)
d.pop(k)                   remove d[k] and return its value
d.popitem()                remove and return an arbitrary           (6)
                           (key, item) pair
d.setdefault(k,defaultval) the item of d with key k                 (5)

    Notes :
      TypeError is raised if key is not acceptable
      (1) KeyError is raised if key k is not in the map
      (2) Keys and values are listed in random order
      (3) d2 must be of the same type as d1
      (4) Never raises an exception if k is not in the map, instead it returns
    defaultVal.
          defaultVal is optional, when not provided and k is not in the map,
    None is returned.
      (5) Never raises an exception if k is not in the map, instead it returns
    defaultVal, and adds k to map with value defaultVal. defaultVal is
    optional. When not provided and k is not in the map, None is returned and
    added to map.
      (6) Raises a KeyError if the dictionary is emtpy.
      (7) While iterating over a dictionary, the values may be updated but
          the keys cannot be changed.

Operations on strings

Note that these string methods largely (but not completely) supersede the
functions available in the string module.


                             Operations on strings
    Operation                             Result                          Notes
s.capitalize()    return a copy of s with only its first character
                  capitalized.
s.center(width)   return a copy of s centered in a string of length width  (1)
                  .
s.count(sub[      return the number of occurrences of substring sub in     (2)
,start[,end]])    string s.
s.decode(([       return a decoded version of s.                           (3)
  encoding
  [,errors]])
s.encode([        return an encoded version of s. Default encoding is the
  encoding        current default string encoding.                         (3)
  [,errors]])
s.endswith(suffix return true if s ends with the specified suffix,         (2)
  [,start[,end]]) otherwise return False.
s.expandtabs([    return a copy of s where all tab characters are          (4)
tabsize])         expanded using spaces.
s.find(sub[,start return the lowest index in s where substring sub is      (2)
[,end]])          found. Return -1 if sub is not found.
s.index(sub[      like find(), but raise ValueError when the substring is  (2)
,start[,end]])    not found.
s.isalnum()       return True if all characters in s are alphanumeric,     (5)
                  False otherwise.
s.isalpha()       return True if all characters in s are alphabetic,       (5)
                  False otherwise.
s.isdigit()       return True if all characters in s are digit             (5)
                  characters, False otherwise.
s.islower()       return True if all characters in s are lowercase, False  (6)
                  otherwise.
s.isspace()       return True if all characters in s are whitespace        (5)
                  characters, False otherwise.
s.istitle()       return True if string s is a titlecased string, False    (7)
                  otherwise.
s.isupper()       return True if all characters in s are uppercase, False  (6)
                  otherwise.
s.join(seq)       return a concatenation of the strings in the sequence
                  seq, seperated by 's's.
s.ljust(width)    return s left justified in a string of length width.    (1),
                                                                           (8)
s.lower()         return a copy of s converted to lowercase.
s.lstrip()        return a copy of s with leading whitespace removed.
s.replace(old,    return a copy of s with all occurrences of substring     (9)
new[, maxsplit])  old replaced by new.
s.rfind(sub[      return the highest index in s where substring sub is     (2)
,start[,end]])    found. Return -1 if sub is not found.
s.rindex(sub[     like rfind(), but raise ValueError when the substring    (2)
,start[,end]])    is not found.
s.rjust(width)    return s right justified in a string of length width.   (1),
                                                                           (8)
s.rstrip()        return a copy of s with trailing whitespace removed.
s.split([sep[     return a list of the words in s, using sep as the       (10)
,maxsplit]])      delimiter string.
s.splitlines([    return a list of the lines in s, breaking at line       (11)
keepends])        boundaries.
s.startswith      return true if s starts with the specified prefix,
(prefix[,start[   otherwise return false.                                  (2)
,end]])
s.strip()         return a copy of s with leading and trailing whitespace
                  removed.
s.swapcase()      return a copy of s with uppercase characters converted
                  to lowercase and vice versa.
                  return a titlecased copy of s, i.e. words start with
s.title()         uppercase characters, all remaining cased characters
                  are lowercase.
s.translate(table return a copy of s mapped through translation table     (12)
[,deletechars])   table.
s.upper()         return a copy of s converted to uppercase.
s.zfill(width)    return a string padded with zeroes on the left side and
                  sliding a minus sign left if necessary.  never truncates.

Notes :
    (1) Padding is done using spaces.
    (2) If optional argument start is supplied, substring s[start:] is
processed. If optional arguments start and end are supplied, substring s[start:
end] is processed.
    (3) Optional argument errors may be given to set a different error handling
scheme. The default for errors is 'strict', meaning that encoding errors raise
a ValueError. Other possible values are 'ignore' and 'replace'.
    (4) If optional argument tabsize is not given, a tab size of 8 characters
is assumed.
    (5) Returns false if string s does not contain at least one character.
    (6) Returns false if string s does not contain at least one cased
character.
    (7) A titlecased string is a string in which uppercase characters may only
follow uncased characters and lowercase characters only cased ones.
    (8) s is returned if width is less than len(s).
    (9) If the optional argument maxsplit is given, only the first maxsplit
occurrences are replaced.
    (10) If sep is not specified or None, any whitespace string is a separator.
If maxsplit is given, at most maxsplit splits are done.
    (11) Line breaks are not included in the resulting list unless keepends is
given and true.
    (12) table must be a string of length 256. All characters occurring in the
optional argument deletechars are removed prior to translation.

String formatting with the % operator

formatString % args--> evaluates to a string

  * formatString uses C printf format codes : %, c, s, i, d, u, o, x, X, e, E,
    f, g, G, r (details below).
  * Width and precision may be a * to specify that an integer argument gives
    the actual width or precision.
  * The flag characters -, +, blank, # and 0 are understood. (details below)
  * %s will convert any type argument to string (uses str() function)
  * args may be a single arg or a tuple of args

        '%s has %03d quote types.' % ('Python', 2)  # => 'Python has 002 quote types.'

  * Right-hand-side can also be a mapping:

        a = '%(lang)s has %(c)03d quote types.' % {'c':2, 'lang':'Python}
(vars() function very handy to use on right-hand-side.)

                                 Format codes
Conversion                               Meaning
d          Signed integer decimal.
i          Signed integer decimal.
o          Unsigned octal.
u          Unsigned decimal.
x          Unsigned hexidecimal (lowercase).
X          Unsigned hexidecimal (uppercase).
e          Floating point exponential format (lowercase).
E          Floating point exponential format (uppercase).
f          Floating point decimal format.
F          Floating point decimal format.
g          Same as "e" if exponent is greater than -4 or less than precision,
           "f" otherwise.
G          Same as "E" if exponent is greater than -4 or less than precision,
           "F" otherwise.
c          Single character (accepts integer or single character string).
r          String (converts any python object using repr()).
s          String (converts any python object using str()).
%          No argument is converted, results in a "%" character in the result.
           (The complete specification is %%.)

                          Conversion flag characters
Flag                                  Meaning
#    The value conversion will use the ``alternate form''.
0    The conversion will be zero padded.
-    The converted value is left adjusted (overrides "-").
     (a space) A blank should be left before a positive number (or empty
     string) produced by a signed conversion.
+    A sign character ("+" or "-") will precede the conversion (overrides a
     "space" flag).

File Objects

Created with built-in function open; may be created by other modules' functions
as well.

Operators on file objects

                                File operations
    Operation                                Result
f.close()         Close file f.
f.fileno()        Get fileno (fd) for file f.
f.flush()         Flush file f's internal buffer.
f.isatty()        True if file f is connected to a tty-like dev, else False.
f.read([size])    Read at most size bytes from file f and return as a string
                  object. If size omitted, read to EOF.
f.readline()      Read one entire line from file f.
f.readlines()     Read until EOF with readline() and return list of lines read.
                  Set file f's position, like "stdio's fseek()".
f.seek(offset[,   whence == 0 then use absolute indexing.
whence=0])        whence == 1 then offset relative to current pos.
                  whence == 2 then offset relative to file end.
f.tell()          Return file f's current position (byte offset).
f.write(str)      Write string to file f.
f.writelines(list Write list of strings to file f.
)

File Exceptions

  EOFError
     End-of-file hit when reading (may be raised many times, e.g. if f is a
    tty).
  IOError
     Other I/O-related I/O operation failure.
  OSError
     OS system call failed.


    Advanced Types

    -See manuals for more details -
      + Module objects
      + Class objects
      + Class instance objects
      + Type objects (see module: types)
      + File objects (see above)
      + Slice objects
      + XRange objects
      + Callable types:
          o User-defined (written in Python):
              # User-defined Function objects
              # User-defined Method objects
          o Built-in (written in C):
              # Built-in Function objects
              # Built-in Method objects
      + Internal Types:
          o Code objects (byte-compile executable Python code: bytecode)
          o Frame objects (execution frames)
          o Traceback objects (stack trace of an exception)


    Statements

    pass            -- Null statement
    del name[,name]* -- Unbind name(s) from object. Object will be indirectly
                        (and automatically) deleted only if no longer referenced.
    print [>> fileobject,] [s1 [, s2 ]* [,]
                    -- Writes to sys.stdout, or to fileobject if supplied.
                       Puts spaces between arguments. Puts newline at end
                       unless statement ends with comma.
                       Print is not required when running interactively,
                       simply typing an expression will print its value,
                       unless the value is None.
    exec x [in globals [,locals]]
                    -- Executes x in namespaces provided. Defaults
                       to current namespaces. x can be a string, file
                       object or a function object.
    callable(value,... [id=value], [*args], [**kw])
                    -- Call function callable with parameters. Parameters can
                       be passed by name or be omitted if function
                       defines default values. E.g. if callable is defined as
                       "def callable(p1=1, p2=2)"
                       "callable()"       <=>  "callable(1, 2)"
                       "callable(10)"     <=>  "callable(10, 2)"
                       "callable(p2=99)"  <=>  "callable(1, 99)"
                       *args is a tuple of positional arguments.
                       **kw is a dictionary of keyword arguments.

    Assignment operators

                              Caption
    Operator                    Result                     Notes
    a = b    Basic assignment - assign object b to label a  (1)
    a += b   Roughly equivalent to a = a + b                (2)
    a -= b   Roughly equivalent to a = a - b                (2)
    a *= b   Roughly equivalent to a = a * b                (2)
    a /= b   Roughly equivalent to a = a / b                (2)
    a %= b   Roughly equivalent to a = a % b                (2)
    a **= b  Roughly equivalent to a = a ** b               (2)
    a &= b   Roughly equivalent to a = a & b                (2)
    a |= b   Roughly equivalent to a = a | b                (2)
    a ^= b   Roughly equivalent to a = a ^ b                (2)
    a >>= b  Roughly equivalent to a = a >> b               (2)
    a <<= b  Roughly equivalent to a = a << b               (2)

    Notes :
        (1) Can unpack tuples, lists, and strings.
           first, second = a[0:2]; [f, s] = range(2); c1,c2,c3='abc'
           Tip: x,y = y,x swaps x and y.
        (2) Not exactly equivalent - a is evaluated only once. Also, where
    possible, operation performed in-place - a is modified rather than
    replaced.

    Control Flow

    if condition: suite
    [elif condition: suite]*
    [else: suite]   -- usual if/else_if/else statement
    while condition: suite
    [else: suite]
                    -- usual while statement. "else" suite is executed
                       after loop exits, unless the loop is exited with
                       "break"
    for element in sequence: suite
    [else: suite]
                    -- iterates over sequence, assigning each element to element.
                       Use built-in range function to iterate a number of times.
                       "else" suite executed at end unless loop exited
                       with "break"
    break           -- immediately exits "for" or "while" loop
    continue        -- immediately does next iteration of "for" or "while" loop
    return [result] -- Exits from function (or method) and returns result (use a tuple to
                       return more than one value). If no result given, then returns None.
    yield result    -- Freezes the execution frame of a generator and returns the result
                       to the iterator's .next() method.  Upon the next call to next(),
                       resumes execution at the frozen point with all of the local variables
                       still intact.

    Exception Statements

    assert expr[, message]
                    -- expr is evaluated. if false, raises exception AssertionError
                       with message. Inhibited if __debug__ is 0.
    try: suite1
    [except [exception [, value]: suite2]+
    [else: suite3]
                    -- statements in suite1 are executed. If an exception occurs, look
                       in "except" clauses for matching <exception>. If matches or bare
                       "except" execute suite of that clause. If no exception happens
                       suite in "else" clause is executed after suite1.
                       If exception has a value, it is put in value.
                       exception can also be tuple of exceptions, e.g.
                       "except (KeyError, NameError), val: print val"
    try: suite1
    finally: suite2
                    -- statements in suite1 are executed. If no
                       exception, execute suite2 (even if suite1 is
                       exited with a "return", "break" or "continue"
                       statement). If exception did occur, executes
                       suite2 and then immediately reraises exception.
    raise exception [,value [, traceback]]
                    -- raises exception with optional value
                       value. Arg traceback specifies a traceback object to
                       use when printing the exception's backtrace.
    raise           -- a raise statement without arguments re-raises
                       the last exception raised in the current function
An exception is either a string (object) or a class instance.
  Can create a new one simply by creating a new string:

              my_exception = 'You did something wrong'
      try:
                   if bad:
              raise my_exception, bad
      except my_exception, value:
                    print 'Oops', value

Exception classes must be derived from the predefined class: Exception, e.g.:
            class text_exception(Exception): pass
            try:
                if bad:
                    raise text_exception()
                    # This is a shorthand for the form
                    # "raise <class>, <instance>"
             except Exception:
                 print 'Oops'
                 # This will be printed because
                 # text_exception is a subclass of Exception
When an error message is printed for an unhandled exception which is a
class, the class name is printed, then a colon and a space, and
finally the instance converted to a string using the built-in function
str().
All built-in exception classes derives from StandardError, itself
derived from Exception.

Name Space Statements

[1.51: On Mac & Windows, the case of module file names must now match the case
as used
  in the import statement]
Packages (>1.5): a package is a name space which maps to a directory including
                module(s) and the special initialization module '__init__.py'
                (possibly empty). Packages/dirs can be nested. You address a
                module's symbol via '[package.[package...]module.symbol's.
import module1 [as name1] [, module2]*
                -- imports modules. Members of module must be
                   referred to by qualifying with [package.]module name:
                   "import sys; print sys.argv:"
                   "import package1.subpackage.module; package1.subpackage.module.foo()"
                   module1 renamed as name1, if supplied.
from module import name1 [as othername1] [, name2]*
                -- imports names from module module in current namespace.
                   "from sys import argv; print argv"
                   "from package1 import module; module.foo()"
                   "from package1.module import foo; foo()"
                   name1 renamed as othername1, if supplied.
from module import *
                -- imports all names in module, except those starting with "_";
                   *to be used sparsely, beware of name clashes* :
                   "from sys import *; print argv"
                   "from package.module import *; print x'
                    NB: "from package import *" only imports the symbols defined
                    in the package's __init__.py file, not those in the
                    template modules!
global name1 [, name2]*
                -- names are from global scope (usually meaning from module)
                   rather than local (usually meaning only in function).
                -- E.g. in fct without "global" statements, assuming
                   "a" is name that hasn't been used in fct or module
                   so far:
                   -Try to read from "a" -> NameError
                   -Try to write to "a" -> creates "a" local to fcn
                   -If "a" not defined in fct, but is in module, then
                       -Try to read from "a", gets value from module
                       -Try to write to "a", creates "a" local to fct
                   But note "a[0]=3" starts with search for "a",
                   will use to global "a" if no local "a".

Function Definition

def func_id ([param_list]): suite
                -- Creates a function object & binds it to name func_id.

    param_list ::= [id [, id]*]
    id ::= value | id = value | *id | **id
    [Args are passed by value.Thus only args representing a mutable object
    can be modified (are inout parameters). Use a tuple to return more than
    one value]

Example:
        def test (p1, p2 = 1+1, *rest, **keywords):
            -- Parameters with "=" have default value (v is
               evaluated when function defined).
               If list has "*id" then id is assigned a tuple of
               all remaining args passed to function (like C vararg)
               If list has "**id" then id is assigned a dictionary of
               all extra arguments passed as keywords.

Class Definition

class <class_id> [(<super_class1> [,<super_class2>]*)]: <suite>
        -- Creates a class object and assigns it name <class_id>
           <suite> may contain local "defs" of class methods and
           assignments to class attributes.
Example:
       class my_class (class1, class_list[3]): ...
                  Creates a class object inheriting from both "class1" and whatever
                  class object "class_list[3]" evaluates to. Assigns new
                  class object to name "my_class".
        - First arg to class methods is always instance object, called 'self'
          by convention.
        - Special method __init__() is called when instance is created.
        - Special method __del__() called when no more reference to object.
        - Create instance by "calling" class object, possibly with arg
          (thus instance=apply(aClassObject, args...) creates an instance!)
        - In current implementation, can't subclass off built-in
          classes. But can "wrap" them, see UserDict & UserList modules,
          and see __getattr__() below.
Example:
        class c (c_parent):
           def __init__(self, name): self.name = name
           def print_name(self): print "I'm", self.name
           def call_parent(self): c_parent.print_name(self)
           instance = c('tom')
           print instance.name
           'tom'
           instance.print_name()
           "I'm tom"
        Call parent's super class by accessing parent's method
        directly and passing "self" explicitly (see "call_parent"
        in example above).
        Many other special methods available for implementing
        arithmetic operators, sequence, mapping indexing, etc.

Documentation Strings

Modules, classes and functions may be documented by placing a string literal by
itself as the first statement in the suite. The documentation can be retrieved
by getting the '__doc__' attribute from the module, class or function.
Example:
        class C:
            "A description of C"
            def __init__(self):
                "A description of the constructor"
                # etc.
Then c.__doc__ == "A description of C".
Then c.__init__.__doc__ == "A description of the constructor".

Others

lambda [param_list]: returnedExpr
                -- Creates an anonymous function. returnedExpr must be
                   an expression, not a statement (e.g., not "if xx:...",
                   "print xxx", etc.) and thus can't contain newlines.
                   Used mostly for filter(), map(), reduce() functions, and GUI callbacks..
List comprehensions
result = [expression for item1 in sequence1  [if condition1]
                        [for item2 in sequence2 ... for itemN in sequenceN]
                      ]
is equivalent to:
result = []
for item1 in sequence1:
    for item2 in sequence2:
    ...
        for itemN in sequenceN:
             if (condition1) and furthur conditions:
                  result.append(expression)



Built-In Functions

                              Built-In Functions
     Function                                 Result
__import__(name[,   Imports module within the given context (see lib ref for
globals[, locals[,  more details)
fromlist]]])
abs(x)              Return the absolute value of number x.
apply(f, args[,     Calls func/method f with arguments args and optional
keywords])          keywords.
bool(x)             Returns True when the argument x is true and False otherwise.
buffer(obj)         Creates a buffer reference to an object.
callable(x)         Returns True if x callable, else False.
chr(i)              Returns one-character string whose ASCII code isinteger i
classmethod(f)      Converts a function f, into a method with the class as the
                    first argument.  Useful for creating alternative constructors.
cmp(x,y)            Returns negative, 0, positive if x <, ==, > to y
coerce(x,y)         Returns a tuple of the two numeric arguments converted to a
                    common type.
                    Compiles string into a code object.filename is used in
                    error message, can be any string. It isusually the file
compile(string,     from which the code was read, or eg. '<string>'if not read
filename, kind)     from file.kind can be 'eval' if string is a single stmt, or
                    'single' which prints the output of expression statements
                    thatevaluate to something else than None, or be 'exec'.
complex(real[,      Builds a complex object (can also be done using J or j
image])             suffix,e.g. 1+3J)
delattr(obj, name)  deletes attribute named name of object obj <=> del obj.name
                    If no args, returns the list of names in current
dict([items])       Create a new dictionary from the specified item list.
dir([object])       localsymbol table. With a module, class or class
                    instanceobject as arg, returns list of names in its attr.
                    dict.
divmod(a,b)         Returns tuple of (a/b, a%b)
enumerate(seq)      Return a iterator giving:  (0, seq[0]), (1, seq[1]), ...
eval(s[, globals[,  Eval string s in (optional) globals, locals contexts.s must
locals]])           have no NUL's or newlines. s can also be acode object.
                    Example: x = 1; incr_x = eval('x + 1')
execfile(file[,     Executes a file without creating a new module, unlike
globals[, locals]]) import.
file()              Synonym for open().
filter(function,    Constructs a list from those elements of sequence for which
sequence)           function returns true. function takes one parameter.
float(x)            Converts a number or a string to floating point.
getattr(object,     [<default> arg added in 1.5.2]Gets attribute called name
name[, default]))   from object,e.g. getattr(x, 'f') <=> x.f). If not found,
                    raisesAttributeError or returns default if specified.
globals()           Returns a dictionary containing current global variables.
hasattr(object,     Returns true if object has attr called name.
name)
hash(object)        Returns the hash value of the object (if it has one)
help(f)             Display documentation on object f.
hex(x)              Converts a number x to a hexadecimal string.
id(object)          Returns a unique 'identity' integer for an object.
input([prompt])     Prints prompt if given. Reads input and evaluates it.
                    Converts a number or a string to a plain integer. Optional
int(x[, base])      base paramenter specifies base from which to convert string
                    values.
intern(aString)     Enters aString in the table of "interned strings"
                    andreturns the string. Interned strings are 'immortals'.
isinstance(obj,     returns true if obj is an instance of class. Ifissubclass
class)              (A,B) then isinstance(x,A) => isinstance(x,B)
issubclass(class1,  returns true if class1 is derived from class2
class2)
                    Returns the length (the number of items) of an object
iter(collection)    Returns an iterator over the collection.
len(obj)            (sequence, dictionary, or instance of class implementing
                    __len__).
list(sequence)      Converts sequence into a list. If already a list,returns a
                    copy of it.
locals()            Returns a dictionary containing current local variables.
                    Converts a number or a string to a long integer. Optional
long(x[, base])     base paramenter specifies base from which to convert string
                    values.
                    Applies function to every item of list and returns a listof
map(function, list, the results. If additional arguments are passed,function
...)                must take that many arguments and it is givento function on
                    each call.
max(seq)            Returns the largest item of the non-empty sequence seq.
min(seq)            Returns the smallest item of a non-empty sequence seq.
oct(x)              Converts a number to an octal string.
open(filename [,    Returns a new file object. First two args are same asthose
mode='r', [bufsize= for C's "stdio open" function. bufsize is 0for unbuffered,
implementation      1 for line-buffered, negative forsys-default, all else, of
dependent]])        (about) given size.
ord(c)              Returns integer ASCII value of c (a string of len 1). Works
                    with Unicode char.
object()            Create a base type.  Used as a superclass for new-style objects.
open(name           Open a file.
  [, mode
  [, buffering]])
pow(x, y [, z])     Returns x to power y [modulo z]. See also ** operator.
property()          Created a property with access controlled by functions.
range(start [,end   Returns list of ints from >= start and < end.With 1 arg,
[, step]])          list from 0..arg-1With 2 args, list from start..end-1With 3
                    args, list from start up to end by step
raw_input([prompt]) Prints prompt if given, then reads string from stdinput (no
                    trailing \n). See also input().
reduce(f, list [,   Applies the binary function f to the items oflist so as to
init])              reduce the list to a single value.If init given, it is
                    "prepended" to list.
                    Re-parses and re-initializes an already imported module.
                    Useful in interactive mode, if you want to reload amodule
reload(module)      after fixing it. If module was syntacticallycorrect but had
                    an error in initialization, mustimport it one more time
                    before calling reload().
                    Returns a string containing a printable and if possible
repr(object)        evaluable representation of an object. <=> `object`
                    (usingbackquotes). Class redefinissable (__repr__). See
                    also str()
round(x, n=0)       Returns the floating point value x rounded to n digitsafter
                    the decimal point.
setattr(object,     This is the counterpart of getattr().setattr(o, 'foobar',
name, value)        3) <=> o.foobar = 3Creates attribute if it doesn't exist!
slice([start,] stop Returns a slice object representing a range, with R/
[, step])           Oattributes: start, stop, step.
                    Returns a string containing a nicely
staticmethod()      Convert a function to method with no self or class
                    argument.  Useful for methods associated with a class that
                    do not need access to an object's internal state.
str(object)         printablerepresentation of an object. Class overridable
                    (__str__).See also repr().
super(type)         Create an unbound super object.  Used to call cooperative
                    superclass methods.
tuple(sequence)     Creates a tuple with same elements as sequence. If already
                    a tuple, return itself (not a copy).
                    Returns a type object [see module types] representing
                    thetype of obj. Example: import typesif type(x) ==
type(obj)           types.StringType: print 'It is a string'NB: it is
                    recommanded to use the following form:if isinstance(x,
                    types.StringType): etc...
unichr(code)        code.
unicode(string[,    Creates a Unicode string from a 8-bit string, using
encoding[, error    thegiven encoding name and error treatment ('strict',
]]])                'ignore',or 'replace'}.
                    Without arguments, returns a dictionary correspondingto the
                    current local symbol table. With a module,class or class
vars([object])      instance object as argumentreturns a dictionary
                    corresponding to the object'ssymbol table. Useful with "%"
                    formatting operator.
xrange(start [, end Like range(), but doesn't actually store entire listall at
[, step]])          once. Good to use in "for" loops when there is abig range
                    and little memory.
zip(seq1[, seq2,    Returns a list of tuples where each tuple contains the nth
...])               element of each of the argument sequences.




Built-In Exceptions

Exception>
         Root class for all exceptions
    SystemExit
         On 'sys.exit()'
    StopIteration
         Signal the end from iterator.next()
    StandardError
                 Base class for all built-in exceptions; derived from Exception
    root class.
        ArithmeticError
                 Base class for OverflowError, ZeroDivisionError,
    FloatingPointError
            FloatingPointError
                       When a floating point operation fails.
            OverflowError
                            On excessively large arithmetic operation
            ZeroDivisionError
                  On division or modulo operation with 0 as 2nd arg
            AssertionError
                When an assert statement fails.
        AttributeError
                    On attribute reference or assignment failure
        EnvironmentError    [new in 1.5.2]
                On error outside Python; error arg tuple is (errno, errMsg...)
            IOError    [changed in 1.5.2]
               I/O-related operation failure
            OSError    [new in 1.5.2]
               used by the os module's os.error exception.
        EOFError
                    Immediate end-of-file hit by input() or raw_input()
        ImportError
         On failure of `import' to find module or name
        KeyboardInterrupt
         On user entry of the interrupt key (often `Control-C')
        LookupError
                base class for IndexError, KeyError
            IndexError
                 On out-of-range sequence subscript
            KeyError
                 On reference to a non-existent mapping (dict) key
        MemoryError
         On recoverable memory exhaustion
        NameError
         On failure to find a local or global (unqualified) name
        RuntimeError
         Obsolete catch-all; define a suitable error instead
          NotImplementedError   [new in 1.5.2]
                On method not implemented
        SyntaxError
         On parser encountering a syntax error
       IndentationError
           On parser encountering an indentation syntax error
       TabError
           On parser encountering an indentation syntax error
        SystemError
         On non-fatal interpreter error - bug - report it
        TypeError
         On passing inappropriate type to built-in op or func
        ValueError
         On arg error not covered by TypeError or more precise
    Warning
              UserWarning
              DeprecationWarning
              PendingDeprecationWarning
              SyntaxWarning
              OverflowWarning
              RuntimeWarning
              FutureWarning



Standard methods & operators redefinition in classes

Standard methods & operators map to special '__methods__' and thus may be
 redefined (mostly in in user-defined classes), e.g.:
    class x:
         def __init__(self, v): self.value = v
         def __add__(self, r): return self.value + r
    a = x(3) # sort of like calling x.__init__(a, 3)
    a + 4    # is equivalent to a.__add__(4)

Special methods for any class

(s: self, o: other)
        __init__(s, args) instance initialization (on construction)
        __del__(s)        called on object demise (refcount becomes 0)
        __repr__(s)       repr() and `...` conversions
        __str__(s)        str() and 'print' statement
        __cmp__(s, o)     Compares s to o and returns <0, 0, or >0.
                          Implements >, <, == etc...
        __hash__(s)       Compute a 32 bit hash code; hash() and dictionary ops
        __nonzero__(s)    Returns False or True for truth value testing
        __getattr__(s, name)  called when attr lookup doesn't find <name>
        __setattr__(s, name, val) called when setting an attr
                                  (inside, don't use "self.name = value"
                                   use "self.__dict__[name] = val")
        __delattr__(s, name)  called to delete attr <name>
        __call__(self, *args) called when an instance is called as function.

Operators

    See list in the operator module. Operator function names are provided with
    2 variants, with or without
    ading & trailing '__' (eg. __add__ or add).

    Numeric operations special methods
    (s: self, o: other)

        s+o       =  __add__(s,o)         s-o        =  __sub__(s,o)
        s*o       =  __mul__(s,o)         s/o        =  __div__(s,o)
        s%o       =  __mod__(s,o)         divmod(s,o) = __divmod__(s,o)
        s**o      =  __pow__(s,o)
        s&o       =  __and__(s,o)
        s^o       =  __xor__(s,o)         s|o        =  __or__(s,o)
        s<<o      =  __lshift__(s,o)      s>>o       =  __rshift__(s,o)
        nonzero(s) = __nonzero__(s) (used in boolean testing)
        -s        =  __neg__(s)           +s         =  __pos__(s)
        abs(s)    =  __abs__(s)           ~s         =  __invert__(s)  (bitwise)
        s+=o      =  __iadd__(s,o)        s-=o       =  __isub__(s,o)
        s*=o      =  __imul__(s,o)        s/=o       =  __idiv__(s,o)
        s%=o      =  __imod__(s,o)
        s**=o     =  __ipow__(s,o)
        s&=o      =  __iand__(s,o)
        s^=o      =  __ixor__(s,o)        s|=o       =  __ior__(s,o)
        s<<=o     =  __ilshift__(s,o)     s>>=o      =  __irshift__(s,o)
        Conversions
        int(s)    =  __int__(s)           long(s)    =  __long__(s)
        float(s)  =  __float__(s)         complex(s)    =  __complex__(s)
        oct(s)    =  __oct__(s)           hex(s)     =  __hex__(s)
        coerce(s,o) = __coerce__(s,o)
        Right-hand-side equivalents for all binary operators exist;
        are called when class instance is on r-h-s of operator:
        a + 3  calls __add__(a, 3)
        3 + a  calls __radd__(a, 3)

    All seqs and maps, general operations plus:
    (s: self, i: index or key)

        len(s)    = __len__(s)        length of object, >= 0.  Length 0 == false
        s[i]      = __getitem__(s,i)  Element at index/key i, origin 0

    Sequences, general methods, plus:
      s[i]=v           = __setitem__(s,i,v)
      del s[i]         = __delitem__(s,i)
      s[i:j]           = __getslice__(s,i,j)
      s[i:j]=seq       = __setslice__(s,i,j,seq)
      del s[i:j]       = __delslice__(s,i,j)   == s[i:j] = []
      seq * n          = __repeat__(seq, n)
      s1 + s2          = __concat__(s1, s2)
      i in s           = __contains__(s, i)
    Mappings, general methods, plus
      hash(s)          = __hash__(s) - hash value for dictionary references
      s[k]=v           = __setitem__(s,k,v)
      del s[k]         = __delitem__(s,k)

Special informative state attributes for some types:

    Modules:
        __doc__ (string/None, R/O): doc string (<=> __dict__['__doc__'])
        __name__(string, R/O): module name (also in __dict__['__name__'])
        __dict__ (dict, R/O): module's name space
        __file__(string/undefined, R/O): pathname of .pyc, .pyo or .pyd (undef for
                 modules statically linked to the interpreter)

    Classes:    [in bold: writable since 1.5.2]
        __doc__ (string/None, R/W): doc string (<=> __dict__['__doc__'])
        __module__ is the module name in which the class was defined
        __name__(string, R/W): class name (also in __dict__['__name__'])
        __bases__ (tuple, R/W): parent classes
        __dict__ (dict, R/W): attributes (class name space)

    Instances:
        __class__ (class, R/W): instance's class
        __dict__ (dict, R/W): attributes

    User-defined functions: [bold: writable since 1.5.2]
        __doc__ (string/None, R/W): doc string
        __name__(string, R/O): function name
        func_doc (R/W): same as __doc__
        func_name (R/O): same as __name__
        func_defaults (tuple/None, R/W): default args values if any
        func_code (code, R/W): code object representing the compiled function body
        func_globals (dict, R/O): ref to dictionary of func global variables
        func_dict (dict, R/W):  same as __dict__ contains the namespace supporting
            arbitrary function attributes
        func_closure (R/O): None or a tuple of cells that contain bindings
            for the function's free variables.


    User-defined Methods:
        __doc__ (string/None, R/O): doc string
        __name__(string, R/O): method name (same as im_func.__name__)
        im_class (class, R/O): class defining the method (may be a base class)
        im_self (instance/None, R/O): target instance object (None if unbound)
        im_func (function, R/O): function object

    Built-in Functions & methods:
        __doc__ (string/None, R/O): doc string
        __name__ (string, R/O): function name
        __self__ : [methods only] target object

    Codes:
        co_name (string, R/O): function name
        co_argcount (int, R/0): number of positional args
        co_nlocals (int, R/O): number of local vars (including args)
        co_varnames (tuple, R/O): names of local vars (starting with args)
        co_cellvars (tuple, R/O)) the names of local variables referenced by
            nested functions
        co_freevars (tuple, R/O)) names of free variables
        co_code (string, R/O): sequence of bytecode instructions
        co_consts (tuple, R/O): litterals used by the bytecode, 1st one is
                                fct doc (or None)
        co_names (tuple, R/O): names used by the bytecode
        co_filename (string, R/O): filename from which the code was compiled
        co_firstlineno (int, R/O): first line number of the function
        co_lnotab (string, R/O): string encoding bytecode offsets to line numbers.
        co_stacksize (int, R/O): required stack size (including local vars)
        co_flags (int, R/O): flags for the interpreter
                           bit 2 set if fct uses "*arg" syntax
                           bit 3 set if fct uses '**keywords' syntax
    Frames:
        f_back (frame/None, R/O): previous stack frame (toward the caller)
        f_code (code, R/O): code object being executed in this frame
        f_locals (dict, R/O): local vars
        f_globals (dict, R/O): global vars
        f_builtins (dict, R/O): built-in (intrinsic) names
        f_restricted (int, R/O): flag indicating whether fct is executed in
                                 restricted mode
        f_lineno (int, R/O): current line number
        f_lasti (int, R/O): precise instruction (index into bytecode)
        f_trace (function/None, R/W): debug hook called at start of each source line
        f_exc_type (Type/None, R/W): Most recent exception type
        f_exc_value (any, R/W): Most recent exception value
        f_exc_traceback (traceback/None, R/W): Most recent exception traceback
    Tracebacks:
        tb_next (frame/None, R/O): next level in stack trace (toward the frame where
                                  the exception occurred)
        tb_frame (frame, R/O): execution frame of the current level
        tb_lineno (int, R/O): line number where the exception occured
        tb_lasti (int, R/O): precise instruction (index into bytecode)

    Slices:
        start (any/None, R/O): lowerbound
        stop (any/None, R/O): upperbound
        step (any/None, R/O): step value

    Complex numbers:
        real (float, R/O): real part
        imag (float, R/O): imaginary part


Important Modules

                                      sys

                              Some sys variables
      Variable                                Content
argv                 The list of command line arguments passed to aPython
                     script. sys.argv[0] is the script name.
builtin_module_names A list of strings giving the names of all moduleswritten
                     in C that are linked into this interpreter.
check_interval       How often to check for thread switches or signals(measured
                     in number of virtual machine instructions)
exc_type, exc_value, Deprecated since release 1.5. Use exc_info() instead.
exc_traceback
exitfunc             User can set to a parameterless fcn. It will getcalled
                     before interpreter exits.
last_type,           Set only when an exception not handled andinterpreter
last_value,          prints an error. Used by debuggers.
last_traceback
maxint               maximum positive value for integers
modules              Dictionary of modules that have already been loaded.
path                 Search path for external modules. Can be modifiedby
                     program. sys.path[0] == dir of script executing
platform             The current platform, e.g. "sunos5", "win32"
ps1, ps2             prompts to use in interactive mode.
                     File objects used for I/O. One can redirect byassigning a
stdin, stdout,       new file object to them (or any object:.with a method
stderr               write(string) for stdout/stderr,.with a method readline()
                     for stdin)
version              string containing version info about Python interpreter.
                     (and also: copyright, dllhandle, exec_prefix, prefix)
version_info         tuple containing Python version info - (major, minor,
                     micro, level, serial).

                              Some sys functions
     Function                                 Result
exit(n)            Exits with status n. Raises SystemExit exception.(Hence can
                   be caught and ignored by program)
getrefcount(object Returns the reference count of the object. Generally one
)                  higher than you might expect, because of object arg temp
                   reference.
setcheckinterval(  Sets the interpreter's thread switching interval (in number
interval)          of virtual code instructions, default:10).
settrace(func)     Sets a trace function: called before each line ofcode is
                   exited.
setprofile(func)   Sets a profile function for performance profiling.
                   Info on exception currently being handled; this is atuple
                   (exc_type, exc_value, exc_traceback).Warning: assigning the
exc_info()         traceback return value to a loca variable in a
                   function handling an exception will cause a circular
                   reference.
setdefaultencoding Change default Unicode encoding - defaults to 7-bit ASCII.
(encoding)
getrecursionlimit  Retrieve maximum recursion depth.
()
setrecursionlimit  Set maximum recursion depth. (Defaults to 1000.)
()



                                      os
"synonym" for whatever O/S-specific module is proper for current environment.
this module uses posix whenever possible.
(see also M.A. Lemburg's utility http://www.lemburg.com/files/python/
platform.py)

                               Some os variables
     Variable                                 Meaning
name                name of O/S-specific module (e.g. "posix", "mac", "nt")
path                O/S-specific module for path manipulations.
                    On Unix, os.path.split() <=> posixpath.split()
curdir              string used to represent current directory ('.')
pardir              string used to represent parent directory ('..')
sep                 string used to separate directories ('/' or '\'). Tip: use
                    os.path.join() to build portable paths.
altsep              Alternate sep
if applicable (None
otherwise)
pathsep             character used to separate search path components (as in
                    $PATH), eg. ';' for windows.
linesep             line separator as used in binary files, ie '\n' on Unix, '\
                    r\n' on Dos/Win, '\r'

                               Some os functions
     Function                                 Result
makedirs(path[,     Recursive directory creation (create required intermediary
mode=0777])         dirs); os.error if fails.
removedirs(path)    Recursive directory delete (delete intermediary empty
                    dirs); if fails.
renames(old, new)   Recursive directory or file renaming; os.error if fails.



                                     posix
don't import this module directly, import os instead !
(see also module: shutil for file copy & remove fcts)

                            posix Variables
Variable                             Meaning
environ  dictionary of environment variables, e.g.posix.environ['HOME'].
error    exception raised on POSIX-related error.
         Corresponding value is tuple of errno code and perror() string.

                             Some posix functions
   Function                                 Result
chdir(path)     Changes current directory to path.
chmod(path,     Changes the mode of path to the numeric mode
mode)
close(fd)       Closes file descriptor fd opened with posix.open.
_exit(n)        Immediate exit, with no cleanups, no SystemExit,etc. Should use
                this to exit a child process.
execv(p, args)  "Become" executable p with args args
getcwd()        Returns a string representing the current working directory
getpid()        Returns the current process id
fork()          Like C's fork(). Returns 0 to child, child pid to parent.[Not
                on Windows]
kill(pid,       Like C's kill [Not on Windows]
signal)
listdir(path)   Lists (base)names of entries in directory path, excluding '.'
                and '..'
lseek(fd, pos,  Sets current position in file fd to position pos, expressedas
how)            an offset relative to beginning of file (how=0), tocurrent
                position (how=1), or to end of file (how=2)
mkdir(path[,    Creates a directory named path with numeric mode (default 0777)
mode])
open(file,      Like C's open(). Returns file descriptor. Use file object
flags, mode)    fctsrather than this low level ones.
pipe()          Creates a pipe. Returns pair of file descriptors (r, w) [Not on
                Windows].
popen(command,  Opens a pipe to or from command. Result is a file object to
mode='r',       read to orwrite from, as indicated by mode being 'r' or 'w'.
bufSize=0)      Use it to catch acommand output ('r' mode) or to feed it ('w'
                mode).
remove(path)    See unlink.
rename(src, dst Renames/moves the file or directory src to dst. [error iftarget
)               name already exists]
rmdir(path)     Removes the empty directory path
read(fd, n)     Reads n bytes from file descriptor fd and return as string.
                Returns st_mode, st_ino, st_dev, st_nlink, st_uid,st_gid,
stat(path)      st_size, st_atime, st_mtime, st_ctime.[st_ino, st_uid, st_gid
                are dummy on Windows]
system(command) Executes string command in a subshell. Returns exitstatus of
                subshell (usually 0 means OK).
                Returns accumulated CPU times in sec (user, system, children's
times()         user,children's sys, elapsed real time). [3 last not on
                Windows]
unlink(path)    Unlinks ("deletes") the file (not dir!) path. same as: remove
utime(path, (   Sets the access & modified time of the file to the given tuple
aTime, mTime))  of values.
wait()          Waits for child process completion. Returns tuple ofpid,
                exit_status [Not on Windows]
waitpid(pid,    Waits for process pid to complete. Returns tuple ofpid,
options)        exit_status [Not on Windows]
write(fd, str)  Writes str to file fd. Returns nb of bytes written.



                                   posixpath
Do not import this module directly, import os instead and refer to this module
as os.path. (e.g. os.path.exists(p)) !

                           Some posixpath functions
 Function                                 Result
abspath(p) Returns absolute path for path p, taking current working dir in
           account.
dirname/
basename(p directory and name parts of the path p. See also split.
)
exists(p)  True if string p is an existing path (file or directory)
expanduser Returns string that is (a copy of) p with "~" expansion done.
(p)
expandvars Returns string that is (a copy of) p with environment vars expanded.
(p)        [Windows: case significant; must use Unix: $var notation, not %var%]
getsize(   return the size in bytes of filename. raise os.error.
filename)
getmtime(  return last modification time of filename (integer nb of seconds
filename)  since epoch).
getatime(  return last access time of filename (integer nb of seconds since
filename)  epoch).
isabs(p)   True if string p is an absolute path.
isdir(p)   True if string p is a directory.
islink(p)  True if string p is a symbolic link.
ismount(p) True if string p is a mount point [true for all dirs on Windows].
join(p[,q  Joins one or more path components intelligently.
[,...]])
           Splits p into (head, tail) where tail is lastpathname component and
split(p)   <head> is everything leadingup to that. <=> (dirname(p), basename
           (p))
splitdrive Splits path p in a pair ('drive:', tail) [Windows]
(p)
splitext(p Splits into (root, ext) where last comp of root contains no periods
)          and ext is empty or startswith a period.
           Calls the function visit with arguments(arg, dirname, names) for
           each directory recursively inthe directory tree rooted at p
walk(p,    (including p itself if it's a dir)The argument dirname specifies the
visit, arg visited directory, the argumentnames lists the files in the
)          directory. The visit function maymodify names to influence the set
           of directories visited belowdirname, e.g., to avoid visiting certain
           parts of the tree.



                                    shutil
high-level file operations (copying, deleting).

                             Main shutil functions
     Function                                 Result
copy(src, dst)     Copies the contents of file src to file dst, retaining file
                   permissions.
copytree(src, dst  Recursively copies an entire directory tree rooted at src
[, symlinks])      into dst (which should not already exist). If symlinks is
                   true, links insrc are kept as such in dst.
rmtree(path[,      Deletes an entire directory tree, ignoring errors if
ignore_errors[,    ignore_errors true,or calling onerror(func, path,
onerror]])         sys.exc_info()) if supplied with

(and also: copyfile, copymode, copystat, copy2)

time

                                  Variables
Variable                               Meaning
altzone  signed offset of local DST timezone in sec west of the 0th meridian.
daylight nonzero if a DST timezone is specified

                                   Functions
  Function                                 Result
time()        return a float representing UTC time in seconds since the epoch.
gmtime(secs), return a tuple representing time : (year aaaa, month(1-12),day
localtime(    (1-31), hour(0-23), minute(0-59), second(0-59), weekday(0-6, 0 is
secs)         monday), Julian day(1-366), daylight flag(-1,0 or 1))
asctime(
timeTuple),
strftime(
format,       return a formated string representing time.
timeTuple)
mktime(tuple) inverse of localtime(). Return a float.
strptime(     parse a formated string representing time, return tuple as in
string[,      gmtime().
format])
sleep(secs)   Suspend execution for <secs> seconds. <secs> can be a float.

and also: clock, ctime.

                                    string

As of Python 2.0, much (though not all) of the functionality provided by the
string module have been superseded by built-in string methods - see Operations
on strings for details.

                             Some string variables
              Variable                                Meaning
digits                               The string '0123456789'
hexdigits, octdigits                 legal hexadecimal & octal digits
letters, uppercase, lowercase,       Strings containing the appropriate
whitespace                           characters
index_error                          Exception raised by index() if substr not
                                     found.

                             Some string functions
     Function                                 Result
expandtabs(s,      returns a copy of string <s> with tabs expanded.
tabSize)
find/rfind(s, sub  Return the lowest/highest index in <s> where the substring
[, start=0[, end=  <sub> is found such that <sub> is wholly contained ins
0])                [start:end]. Return -1 if <sub> not found.
ljust/rjust/center Return a copy of string <s> left/right justified/centerd in
(s, width)         afield of given width, padded with spaces. <s> is
                   nevertruncated.
lower/upper(s)     Return a string that is (a copy of) <s> in lowercase/
                   uppercase
split(s[, sep=     Return a list containing the words of the string <s>,using
whitespace[,       the string <sep> as a separator.
maxsplit=0]])
join(words[, sep=' Concatenate a list or tuple of words with
'])                interveningseparators; inverse of split.
replace(s, old,    Returns a copy of string <s> with all occurences of
new[, maxsplit=0]  substring<old> replaced by <new>. Limits to <maxsplit>
                   firstsubstitutions if specified.
strip(s)           Return a string that is (a copy of) <s> without leadingand
                   trailing whitespace. see also lstrip, rstrip.



                                   re (sre)

Handles Unicode strings. Implemented in new module sre, re now a mere front-end
for compatibility.
Patterns are specified as strings. Tip: Use raw strings (e.g. r'\w*') to
litteralize backslashes.


                           Regular expression syntax
   Form                                Description
.          matches any character (including newline if DOTALL flag specified)
^          matches start of the string (of every line in MULTILINE mode)
$          matches end of the string (of every line in MULTILINE mode)
*          0 or more of preceding regular expression (as many as possible)
+          1 or more of preceding regular expression (as many as possible)
?          0 or 1 occurence of preceding regular expression
*?, +?, ?? Same as *, + and ? but matches as few characters as possible
{m,n}      matches from m to n repetitions of preceding RE
{m,n}?     idem, attempting to match as few repetitions as possible
[ ]        defines character set: e.g. '[a-zA-Z]' to match all letters(see also
           \w \S)
[^ ]       defines complemented character set: matches if char is NOT in set
           escapes special chars '*?+&$|()' and introduces special sequences
\          (see below). Due to Python string rules, write as '\\' orr'\' in the
           pattern string.
\\         matches a litteral '\'; due to Python string rules, write as '\\\\
           'in pattern string, or better using raw string: r'\\'.
|          specifies alternative: 'foo|bar' matches 'foo' or 'bar'
(...)      matches any RE inside (), and delimits a group.
(?:...)    idem but doesn't delimit a group.
           matches if ... matches next, but doesn't consume any of the string
(?=...)    e.g. 'Isaac (?=Asimov)' matches 'Isaac' only if followed by
           'Asimov'.
(?!...)    matches if ... doesn't match next. Negative of (?=...)
(?P<name   matches any RE inside (), and delimits a named group. (e.g. r'(?P
>...)      <id>[a-zA-Z_]\w*)' defines a group named id)
(?P=name)  matches whatever text was matched by the earlier group named name.
(?#...)    A comment; ignored.
(?letter)  letter is one of 'i','L', 'm', 's', 'x'. Set the corresponding flags
           (re.I, re.L, re.M, re.S, re.X) for the entire RE.

                               Special sequences
Sequence                              Description
number   matches content of the group of the same number; groups are numbered
         starting from 1
\A       matches only at the start of the string
\b       empty str at beg or end of word: '\bis\b' matches 'is', but not 'his'
\B       empty str NOT at beginning or end of word
\d       any decimal digit (<=> [0-9])
\D       any non-decimal digit char (<=> [^O-9])
\s       any whitespace char (<=> [ \t\n\r\f\v])
\S       any non-whitespace char (<=> [^ \t\n\r\f\v])
\w       any alphaNumeric char (depends on LOCALE flag)
\W       any non-alphaNumeric char (depends on LOCALE flag)
\Z       matches only at the end of the string

                         Variables
Variable                       Meaning
error    Exception when pattern string isn't a valid regexp.

                                   Functions
   Function                                 Result
               Compile a RE pattern string into a regular expression object.
               Flags (combinable by |):

               I or IGNORECASE or (?i)
                   case insensitive matching
compile(       L or LOCALE or (?L)
pattern[,          make \w, \W, \b, \B dependent on thecurrent locale
flags=0])      M or MULTILINE or (?m)
                   matches every new line and not onlystart/end of the whole
                   string
               S or DOTALL or (?s)
                   '.' matches ALL chars, including newline
               X or VERBOSE or (?x)
                   Ignores whitespace outside character sets
escape(string) return (a copy of) string with all non-alphanumerics
               backslashed.
match(pattern, if 0 or more chars at beginning of <string> match the RE pattern
string[, flags string,return a corresponding MatchObject instance, or None if
])             no match.
search(pattern scan thru <string> for a location matching <pattern>, return
, string[,     acorresponding MatchObject instance, or None if no match.
flags])
split(pattern, split <string> by occurrences of <pattern>. If capturing () are
string[,       used inpattern, then occurrences of patterns or subpatterns are
maxsplit=0])   also returned.
findall(       return a list of non-overlapping matches in <pattern>, either a
pattern,       list ofgroups or a list of tuples if the pattern has more than 1
string)        group.
               return string obtained by replacing the (<count> first) lefmost
sub(pattern,   non-overlapping occurrences of <pattern> (a string or a RE
repl, string[, object) in <string>by <repl>; <repl> can be a string or a fct
count=0])      called with a single MatchObj arg, which must return the
               replacement string.
subn(pattern,
repl, string[, same as sub(), but returns a tuple (newString, numberOfSubsMade)
count=0])

Regular Expression Objects


(RE objects are returned by the compile fct)

                          re object attributes
Attribute                            Descrition
flags      flags arg used when RE obj was compiled, or 0 if none provided
groupindex dictionary of {group name: group number} in pattern
pattern    pattern string from which RE obj was compiled

                               re object methods
  Method                                  Result
            If zero or more characters at the beginning of string match this
            regular expression, return a corresponding MatchObject instance.
            Return None if the string does not match the pattern; note that
            this is different from a zero-length match.
            The optional second parameter pos gives an index in the string
match(      where the search is to start; it defaults to 0. This is not
string[,    completely equivalent to slicing the string; the '' pattern
pos][,      character matches at the real beginning of the string and at
endpos])    positions just after a newline, but not necessarily at the index
            where the search is to start.
            The optional parameter endpos limits how far the string will be
            searched; it will be as if the string is endpos characters long, so
            only the characters from pos to endpos will be searched for a
            match.
            Scan through string looking for a location where this regular
search(     expression produces a match, and return a corresponding MatchObject
string[,    instance. Return None if no position in the string matches the
pos][,      pattern; note that this is different from finding a zero-length
endpos])    match at some point in the string.
            The optional pos and endpos parameters have the same meaning as for
            the match() method.
split(
string[,    Identical to the split() function, using the compiled pattern.
maxsplit=
0])
findall(    Identical to the findall() function, using the compiled pattern.
string)
sub(repl,
string[,    Identical to the sub() function, using the compiled pattern.
count=0])
subn(repl,
string[,    Identical to the subn() function, using the compiled pattern.
count=0])

Match Objects


(Match objects are returned by the match & search functions)

                            Match object attributes
Attribute                              Description
pos       value of pos passed to search or match functions; index intostring at
          which RE engine started search.
endpos    value of endpos passed to search or match functions; index intostring
          beyond which RE engine won't go.
re        RE object whose match or search fct produced this MatchObj instance
string    string passed to match() or search()

                            Match object functions
Function                                 Result
          returns one or more groups of the match. If one arg, result is a
group([g1 string;if multiple args, result is a tuple with one item per arg. If
, g2,     gi is 0,return value is entire matching string; if 1 <= gi <= 99,
...])     returnstring matching group #gi (or None if no such group); gi may
          also bea group name.
          returns a tuple of all groups of the match; groups not
groups()  participatingto the match have a value of None. Returns a string
          instead of tupleif len(tuple)=1
start(
group),   returns indices of start & end of substring matched by group (or
end(group Noneif group exists but doesn't contribute to the match)
)
span(     returns the 2-tuple (start(group), end(group)); can be (None, None)if
group)    group didn't contibute to the match.



                                     math

Variables:
pi
e
Functions (see ordinary C man pages for info):
acos(x)
asin(x)
atan(x)
atan2(x, y)
ceil(x)
cos(x)
cosh(x)
degrees(x)
exp(x)
fabs(x)
floor(x)
fmod(x, y)
frexp(x)        -- Unlike C: (float, int) = frexp(float)
ldexp(x, y)
log(x [,base])
log10(x)
modf(x)         -- Unlike C: (float, float) = modf(float)
pow(x, y)
radians(x)
sin(x)
sinh(x)
sqrt(x)
tan(x)
tanh(x)

                                    getopt

Functions:
getopt(list, optstr)    -- Similar to C. <optstr> is option
                           letters to look for. Put ':' after letter
                           if option takes arg. E.g.
    # invocation was "python test.py -c hi -a arg1 arg2"
       opts, args =  getopt.getopt(sys.argv[1:], 'ab:c:')
    # opts would be
       [('-c', 'hi'), ('-a', '')]
    # args would be
       ['arg1', 'arg2']


List of modules and packages in base distribution

(built-ins and content of python Lib directory)
(Python NT distribution, may be slightly different in other distributions)

                           Standard library modules
   Operation                                 Result
aifc             Stuff to parse AIFF-C and AIFF files.
anydbm           Generic interface to all dbm clones. (dbhash, gdbm,
                 dbm,dumbdbm)
asynchat         Support for 'chat' style protocols
asyncore         Asynchronous File I/O (in select style)
atexit           Register functions to be called at exit of Python interpreter.
audiodev         Audio support for a few platforms.
base64           Conversions to/from base64 RFC-MIME transport encoding .
BaseHTTPServer   Base class forhttp services.
Bastion          "Bastionification" utility (control access to instance vars)
bdb              A generic Python debugger base class.
binhex           Macintosh binhex compression/decompression.
bisect           List bisection algorithms.
bz2              Support for bz2 compression/decompression.
calendar         Calendar printing functions.
cgi              Wraps the WWW Forms Common Gateway Interface (CGI).
cgitb            Utility for handling CGI tracebacks.
CGIHTTPServer    CGI http services.
cmd              A generic class to build line-oriented command interpreters.
datetime         Basic date and time types.
code             Utilities needed to emulate Python's interactive interpreter
codecs           Lookup existing Unicode encodings and register new ones.
colorsys         Conversion functions between RGB and other color systems.
commands         Tools for executing UNIX commands .
compileall       Force "compilation" of all .py files in a directory.
ConfigParser     Configuration file parser (much like windows .ini files)
copy             Generic shallow and deep copying operations.
copy_reg         Helper to provide extensibility for pickle/cPickle.
dbhash           (g)dbm-compatible interface to bsdhash.hashopen.
dircache         Sorted list of files in a dir, using a cache.
[DEL:dircmp:DEL] [DEL:Defines a class to build directory diff tools on.:DEL]
difflib          Tool for creating delta between sequences.
dis              Bytecode disassembler.
distutils        Package installation system.
doctest          Tool for running and verifying tests inside doc strings.
dospath          Common operations on DOS pathnames.
dumbdbm          A dumb and slow but simple dbm clone.
[DEL:dump:DEL]   [DEL:Print python code that reconstructs a variable.:DEL]
email            Comprehensive support for internet email.
exceptions       Class based built-in exception hierarchy.
filecmp          File comparison.
fileinput        Helper class to quickly write a loop over all standard input
                 files.
[DEL:find:DEL]   [DEL:Find files directory hierarchy matching a pattern.:DEL]
fnmatch          Filename matching with shell patterns.
formatter        A test formatter.
fpformat         General floating point formatting functions.
ftplib           An FTP client class. Based on RFC 959.
gc               Perform garbacge collection, obtain GC debug stats, and tune
                 GC parameters.
getopt           Standard command line processing. See also ftp://
                 www.pauahtun.org/pub/getargspy.zip
getpass          Utilities to get a password and/or the current user name.
glob             filename globbing.
gopherlib        Gopher protocol client interface.
[DEL:grep:DEL]   [DEL:'grep' utilities.:DEL]
gzip             Read & write gzipped files.
heapq            Priority queue implemented using lists organized as heaps.
HMAC             Keyed-Hashing for Message Authentication -- RFC 2104.
htmlentitydefs   Proposed entity definitions for HTML.
htmllib          HTML parsing utilities.
HTMLParser       A parser for HTML and XHTML.
httplib          HTTP client class.
ihooks           Hooks into the "import" mechanism.
imaplib          IMAP4 client.Based on RFC 2060.
imghdr           Recognizing image files based on their first few bytes.
imputil          Privides a way of writing customised import hooks.
inspect          Tool for probing live Python objects.
keyword          List of Python keywords.
knee             A Python re-implementation of hierarchical module import.
linecache        Cache lines from files.
linuxaudiodev    Lunix /dev/audio support.
locale           Support for number formatting using the current locale
                 settings.
logging          Python logging facility.
macpath          Pathname (or related) operations for the Macintosh.
macurl2path      Mac specific module for conversion between pathnames and URLs.
mailbox          A class to handle a unix-style or mmdf-style mailbox.
mailcap          Mailcap file handling (RFC 1524).
mhlib            MH (mailbox) interface.
mimetools        Various tools used by MIME-reading or MIME-writing programs.
mimetypes        Guess the MIME type of a file.
MimeWriter       Generic MIME writer.
mimify           Mimification and unmimification of mail messages.
mmap             Interface to memory-mapped files - they behave like mutable
                 strings./font>
multifile        Class to make multi-file messages easier to handle.
mutex            Mutual exclusion -- for use with module sched.
netrc
nntplib          An NNTP client class. Based on RFC 977.
ntpath           Common operations on DOS pathnames.
nturl2path       Mac specific module for conversion between pathnames and URLs.
optparse         A comprehensive tool for processing command line options.
os               Either mac, dos or posix depending system.
[DEL:packmail:   [DEL:Create a self-unpacking shell archive.:DEL]
DEL]
pdb              A Python debugger.
pickle           Pickling (save and restore) of Python objects (a faster
                 Cimplementation exists in built-in module: cPickle).
pipes            Conversion pipeline templates.
pkgunil          Utilities for working with Python packages.
popen2           variations on pipe open.
poplib           A POP3 client class. Based on the J. Myers POP3 draft.
posixfile        Extended (posix) file operations.
posixpath        Common operations on POSIX pathnames.
pprint           Support to pretty-print lists, tuples, & dictionaries
                 recursively.
profile          Class for profiling python code.
pstats           Class for printing reports on profiled python code.
pydoc            Utility for generating documentation from source files.
pty              Pseudo terminal utilities.
pyexpat          Interface to the Expay XML parser.
py_compile       Routine to "compile" a .py file to a .pyc file.
pyclbr           Parse a Python file and retrieve classes and methods.
Queue            A multi-producer, multi-consumer queue.
quopri           Conversions to/from quoted-printable transport encoding.
rand             Don't use unless you want compatibility with C's rand().
random           Random variable generators
re               Regular Expressions.
reconvert        Convert old ("regex") regular expressions to new syntax
                 ("re").
repr             Redo repr() but with limits on most sizes.
rexec            Restricted execution facilities ("safe" exec, eval, etc).
rfc822           RFC-822 message manipulation class.
rlcompleter      Word completion for GNU readline 2.0.
robotparser      Parse robot.txt files, useful for web spiders.
sched            A generally useful event scheduler class.
sets             Module for a set datatype.
sgmllib          A parser for SGML.
shelve           Manage shelves of pickled objects.
shlex            Lexical analyzer class for simple shell-like syntaxes.
shutil           Utility functions usable in a shell-like program.
SimpleHTTPServer Simple extension to base http class
site             Append module search paths for third-party packages to
                 sys.path.
smtplib          SMTP Client class (RFC 821)
sndhdr           Several routines that help recognizing sound.
SocketServer     Generic socket server classes.
stat             Constants and functions for interpreting stat/lstat struct.
statcache        Maintain a cache of file stats.
statvfs          Constants for interpreting statvfs struct as returned by
                 os.statvfs()and os.fstatvfs() (if they exist).
string           A collection of string operations.
StringIO         File-like objects that read/write a string buffer (a fasterC
                 implementation exists in built-in module: cStringIO).
sunau            Stuff to parse Sun and NeXT audio files.
sunaudio         Interpret sun audio headers.
symbol           Non-terminal symbols of Python grammar (from "graminit.h").
tabnanny,/font>  Check Python source for ambiguous indentation.
tarfile          Facility for reading and writing to the *nix tarfile format.
telnetlib        TELNET client class. Based on RFC 854.
tempfile         Temporary file name allocation.
textwrap         Object for wrapping and filling text.
threading        Proposed new higher-level threading interfaces
threading_api    (doc of the threading module)
toaiff           Convert "arbitrary" sound files to AIFF files .
token            Tokens (from "token.h").
tokenize         Compiles a regular expression that recognizes Python tokens.
traceback        Format and print Python stack traces.
tty              Terminal utilities.
turtle           LogoMation-like turtle graphics
types            Define names for all type symbols in the std interpreter.
tzparse          Parse a timezone specification.
unicodedata      Interface to unicode properties.
urllib           Open an arbitrary URL.
urlparse         Parse URLs according to latest draft of standard.
user             Hook to allow user-specified customization code to run.
UserDict         A wrapper to allow subclassing of built-in dict class.
UserList         A wrapper to allow subclassing of built-in list class.
UserString       A wrapper to allow subclassing of built-in string class.
[DEL:util:DEL]   [DEL:some useful functions that don't fit elsewhere !!:DEL]
uu               UUencode/UUdecode.
unittest         Utilities for implementing unit testing.
wave             Stuff to parse WAVE files.
weakref          Tools for creating and managing weakly referenced objects.
webbrowser       Platform independent URL launcher.
[DEL:whatsound:  [DEL:Several routines that help recognizing sound files.:DEL]
DEL]
whichdb          Guess which db package to use to open a db file.
xdrlib           Implements (a subset of) Sun XDR (eXternal Data
                 Representation)
xmllib           A parser for XML, using the derived class as static DTD.
xml.dom          Classes for processing XML using the Document Object Model.
xml.sax          Classes for processing XML using the SAX API.
xmlrpclib        Support for remote procedure calls using XML.
zipfile          Read & write PK zipped files.
[DEL:zmod:DEL]   [DEL:Demonstration of abstruse mathematical concepts.:DEL]



* Built-ins *

            sys                 Interpreter state vars and functions
            __built-in__        Access to all built-in python identifiers
            __main__            Scope of the interpreters main program, script or stdin
            array               Obj efficiently representing arrays of basic values
            math                Math functions of C standard
            time                Time-related functions (also the newer datetime module)
            regex               Regular expression matching operations
            marshal             Read and write some python values in binary format
            struct              Convert between python values and C structs

* Standard *

            getopt              Parse cmd line args in sys.argv.  A la UNIX 'getopt'.
            os                  A more portable interface to OS dependent functionality
            re                  Functions useful for working with regular expressions
            string              Useful string and characters functions and exceptions
            random              Mersenne Twister pseudo-random number generator
            thread              Low-level primitives for working with process threads
            threading           idem, new recommanded interface.

* Unix/Posix *

            dbm                 Interface to Unix ndbm database library
            grp                 Interface to Unix group database
            posix               OS functionality standardized by C and POSIX standards
            posixpath           POSIX pathname functions
            pwd                 Access to the Unix password database
            select              Access to Unix select multiplex file synchronization
            socket              Access to BSD socket interface

* Tk User-interface Toolkit *

            tkinter             Main interface to Tk

* Multimedia *

            audioop             Useful operations on sound fragments
            imageop             Useful operations on images
            jpeg                Access to jpeg image compressor and decompressor
            rgbimg              Access SGI imglib image files

* Cryptographic Extensions *

            md5         Interface to RSA's MD5 message digest algorithm
            mpz         Interface to int part of GNU multiple precision library
            rotor       Implementation of a rotor-based encryption algorithm
            HMAC        Keyed-Hashing for Message Authentication -- RFC 2104.

* Stdwin * Standard Window System

            stdwin              Standard Window System interface
            stdwinevents        Stdwin event, command, and selection constants
            rect                Rectangle manipulation operations

* SGI IRIX * (4 & 5)

            al          SGI audio facilities
            AL          al constants
            fl          Interface to FORMS library
            FL          fl constants
            flp Functions for form designer
            fm          Access to font manager library
            gl          Access to graphics library
            GL          Constants for gl
            DEVICE      More constants for gl
            imgfile     Imglib image file interface

* Suns *

            sunaudiodev Access to sun audio interface


Workspace exploration and idiom hints

        dir(<module>)   list functions, variables in <module>
        dir()           get object keys, defaults to local name space
        if __name__ == '__main__': main()            invoke main if running as script
        map(None, lst1, lst2, ...)                   merge lists
        b = a[:]                                     create copy of seq structure
        _                       in interactive mode, is last value printed







Python Mode for Emacs

(Not revised, possibly not up to date)
Type C-c ? when in python-mode for extensive help.
INDENTATION
Primarily for entering new code:
        TAB      indent line appropriately
        LFD      insert newline, then indent
        DEL      reduce indentation, or delete single character
Primarily for reindenting existing code:
        C-c :    guess py-indent-offset from file content; change locally
        C-u C-c :        ditto, but change globally
        C-c TAB  reindent region to match its context
        C-c <    shift region left by py-indent-offset
        C-c >    shift region right by py-indent-offset
MARKING & MANIPULATING REGIONS OF CODE
C-c C-b         mark block of lines
M-C-h           mark smallest enclosing def
C-u M-C-h       mark smallest enclosing class
C-c #           comment out region of code
C-u C-c #       uncomment region of code
MOVING POINT
C-c C-p         move to statement preceding point
C-c C-n         move to statement following point
C-c C-u         move up to start of current block
M-C-a           move to start of def
C-u M-C-a       move to start of class
M-C-e           move to end of def
C-u M-C-e       move to end of class
EXECUTING PYTHON CODE
C-c C-c sends the entire buffer to the Python interpreter
C-c |   sends the current region
C-c !   starts a Python interpreter window; this will be used by
        subsequent C-c C-c or C-c | commands
C-c C-w runs PyChecker

VARIABLES
py-indent-offset        indentation increment
py-block-comment-prefix comment string used by py-comment-region
py-python-command       shell command to invoke Python interpreter
py-scroll-process-buffer        t means always scroll Python process buffer
py-temp-directory       directory used for temp files (if needed)
py-beep-if-tab-change   ring the bell if tab-width is changed


The Python Debugger

(Not revised, possibly not up to date, see 1.5.2 Library Ref section 9.1; in 1.5.2, you may also use debugger integrated in IDLE)

Accessing

import pdb      (it's a module written in Python)
        -- defines functions :
           run(statement[,globals[, locals]])
                        -- execute statement string under debugger control, with optional
                           global & local environment.
           runeval(expression[,globals[, locals]])
                        -- same as run, but evaluate expression and return value.
           runcall(function[, argument, ...])
                        -- run function object with given arg(s)
           pm()         -- run postmortem on last exception (like debugging a core file)
           post_mortem(t)
                        -- run postmortem on traceback object <t>

        -- defines class Pdb :
           use Pdb to create reusable debugger objects. Object
           preserves state (i.e. break points) between calls.

        runs until a breakpoint hit, exception, or end of program
        If exception, variable '__exception__' holds (exception,value).

Commands

h, help
        brief reminder of commands
b, break [<arg>]
        if <arg> numeric, break at line <arg> in current file
        if <arg> is function object, break on entry to fcn <arg>
        if no arg, list breakpoints
cl, clear [<arg>]
        if <arg> numeric, clear breakpoint at <arg> in current file
        if no arg, clear all breakpoints after confirmation
w, where
        print current call stack
u, up
        move up one stack frame (to top-level caller)
d, down
        move down one stack frame
s, step
        advance one line in the program, stepping into calls
n, next
        advance one line, stepping over calls
r, return
        continue execution until current function returns
        (return value is saved in variable "__return__", which
        can be printed or manipulated from debugger)
c, continue
        continue until next breakpoint
j, jump lineno
        Set the next line that will be executed
a, args
        print args to current function
rv, retval
        prints return value from last function that returned
p, print <arg>
        prints value of <arg> in current stack frame
l, list [<first> [, <last>]]
               List source code for the current file.
               Without arguments, list 11 lines around the current line
               or continue the previous listing.
               With one argument, list 11 lines starting at that line.
               With two arguments, list the given range;
               if the second argument is less than the first, it is a count.
whatis <arg>
        prints type of <arg>
!
        executes rest of line as a Python statement in the current stack frame
q quit
        immediately stop execution and leave debugger
<return>
        executes last command again
Any input debugger doesn't recognize as a command is assumed to be a
Python statement to execute in the current stack frame, the same way
the exclamation mark ("!") command does.

Example

(1394) python
Python 1.0.3 (Sep 26 1994)
Copyright 1991-1994 Stichting Mathematisch Centrum, Amsterdam
>>> import rm
>>> rm.run()
Traceback (innermost last):
         File "<stdin>", line 1
         File "./rm.py", line 7
           x = div(3)
         File "./rm.py", line 2
           return a / r
ZeroDivisionError: integer division or modulo
>>> import pdb
>>> pdb.pm()
> ./rm.py(2)div: return a / r
(Pdb) list
         1     def div(a):
         2  ->     return a / r
         3
         4     def run():
         5         global r
         6         r = 0
         7         x = div(3)
         8         print x
[EOF]
(Pdb) print r
0
(Pdb) q
>>> pdb.runcall(rm.run)
etc.

Quirks

Breakpoints are stored as filename, line number tuples. If a module is reloaded
after editing, any remembered breakpoints are likely to be wrong.

Always single-steps through top-most stack frame. That is, "c" acts like "n".


