                          Python 2.0 Quick Reference



 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/ and http://www.vex.net/parnassus/
Full documentation: http://www.python.org/doc/
An excellent Python reference book: Python Essential Reference by David Beazley
(New Riders)


Contents

  * Invocation Options
  * Environment Variables
  * Lexical Entities : keywords, identifiers, strings, numbers, sequences,
    dictionaries, operators
  * Basic Types And Their Operations
  * Advanced Types
  * Statements
  * Built In Functions
  * Built In Exceptions
  * Standard methods & operators redefinition in user-created Classes
  * Special informative state attributes for some types
  * Important Modules : sys, os, posix, posixpath, shutil, time, string, re,
    math, getopt
  * List of modules In base distribution
  * Workspace Exploration And Idiom Hints
  * Python Mode for Emacs
  * The Python Debugger



Invocation Options

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

                              Invocation Options
Option                                  Effect
-d      Outputs parser debugging information (also PYTHONDEBUG=x)
-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 (set __debug__ = 0 =>s suppresses asserts)
-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).
-U      Force Python to interpret all string literals as Unicode literals.
-v      Verbose (trace import statements) (also PYTHONVERBOSE=x)
-x      Skip first line of source, allowing use of non-unix Forms of #!cmd
[DEL:-X [DEL:Disable class based built-in exceptions (for backward
:DEL]   compatibility management of exceptions):DEL]
-?      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
    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, 0177777777777777777L (begin with a 0)
    Hex integer: 0xFF, 0XFFFFffffFFFFFFFFFFL (begin with 0x or 0X)
    Long integer (unlimited precision): 1234567890123456L (ends with L or l)
    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)

    Dictionary of length 0, 1, 2, etc:
    {} {1 : 'first'} {1 : 'first',  'next': 'second'}

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                     mult, division, modulo
        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


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__.
    (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

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

                Operations on all sequence types
Operation                     Result                     Notes
x in s     1 if an item of s is equal to x, else 0
x not in s 0 if an item of s is equal to x, else 1
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)

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.extend(x)      same as s[len(s):len(s)]= x                (5)
s.count(x)       return number of i's for which s[i] == 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.remove(x)      same as del s[s.index(x)]                  (1)
s.pop([i])       same as x = s[i]; del s[i]; return x       (4)
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 pop() method is experimental and not supported by
other mutable sequence types than lists.
          The optional  argument i defaults to -1, so that by default the last
item is removed and returned.
     (5) [New 1.5.2] Experimental ! Raises an exception when x is not a list
object.



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.has_key(k)               1 if d has key k, else 0
d.items()                  a copy of d's list of (key, item) pairs  (2)
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.get(k,defaultval)        the item of d with key k                 (4)
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.

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.encode([        return an encoded version of s. Default encoding is the
encoding[,errors  current default string encoding.                         (3)
]])
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.

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()        1 if file f is connected to a tty-like dev, else 0.
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


    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.

    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.
callable(x)         Returns 1 if x callable, else 0.
chr(i)              Returns one-character string whose ASCII code isinteger i
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
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)
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.
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)
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
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.
pow(x, y [, z])     Returns x to power y [modulo z]. See also ** operator.
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
str(object)         printablerepresentation of an object. Class overridable
                    (__str__).See also repr().
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()'
    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



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 0 or 1 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:

    Lists & Dictionaries:
        __methods__ (list, R/O): list of method names of the object

    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)
        __path__(string/undefined, R/O): fully qualified package name when applies.

    Classes:    [in bold: writable since 1.5.2]
        __doc__ (string/None, R/W): doc string (<=> __dict__['__doc__'])
        __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

    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
        __members__ = list of attr names: ['__doc__','__name__','__self__'])
    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_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_firstlineno (int, R/O): first line number of the function
        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
    XRanges:
        tolist (Built-in method, R/O): ?


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 1
)                  higherthan you might expect, because of object arg temp
                   reference.
setcheckinterval(  Sets the interpreter's thread switching interval (in number
interval)          ofvirtualcode 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
                   functionhandling 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)
exp(x)
fabs(x)
floor(x)
fmod(x, y)
frexp(x)        -- Unlike C: (float, int) = frexp(float)
ldexp(x, y)
log(x)
log10(x)
modf(x)         -- Unlike C: (float, float) = modf(float)
pow(x, y)
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.
calendar         Calendar printing functions.
cgi              Wraps the WWW Forms Common Gateway Interface (CGI).
CGIHTTPServer    CGI http services.
cmd              A generic class to build line-oriented command interpreters.
[DEL:cmp:DEL]    [DEL:Efficiently compare files, boolean outcome only.:DEL]
[DEL:cmpcache:   [DEL:Same, but caches 'stat' results for speed.:DEL]
DEL]
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]
dis              Bytecode disassembler.
distutils        Package installation system.
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]
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.
htmlentitydefs   Proposed entity definitions for HTML.
htmllib          HTML parsing utilities.
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.
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.
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.
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.
[DEL:poly:DEL]   [DEL:Polynomials.:DEL]
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.
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 (obsolete, use whrandom)
re               Regular Expressions.
reconvert        Convert old ("regex") regular expressions to new syntax
                 ("re").
regex_syntax     Flags for regex.set_syntax().
regexp           Backward compatibility for module "regexp" using "regex".
regsub           Regular expression subroutines.
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.
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.
telnetlib        TELNET client class. Based on RFC 854.
tempfile         Temporary file name allocation.
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.
wave             Stuff to parse WAVE files.
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.
whrandom         Wichmann-Hill random number generator.
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.
zipfile          Read & write PK zipped files.
[DEL:zmod:DEL]   [DEL:Demonstration of abstruse mathematical concepts.:DEL]



(following list not revised)

* 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
            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
            whrandom            Wichmann-Hill 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

* 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
        X.__methods__   list of methods supported by X (if any)
        X.__members__   List of X's data attributes
        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
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
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".


