diff --git a/Misc/cheatsheet b/Misc/cheatsheet
index 204b51b..a4d96e2 100644
--- a/Misc/cheatsheet
+++ b/Misc/cheatsheet
@@ -1,541 +1,2218 @@
- 			  A Python Bestiary
-		 Itemizing Python Objects and Nuances
+                          Python 2.0 Quick Reference
 
-   $Revision$ $Date$ 	ken.manheimer@nist.gov
 
-  			   Notable lexical entities
-			   ========================
 
-    Keywords
+ 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
 
-     	access	       and	      break	     class
-     	continue       def	      del	     elif
-     	else	       except	      exec	     finally
-     	for	       from	      global	     if
-     	import	       in	      is	     lambda
-     	not	       or	      pass	     print
-     	raise	       return	      try	     while
+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)		\0XX  char with
-     \" Double quote (")     \n Linefeed (LF)		      octal value XX
-     \a Bell (BEL)	     \r Carriage Return (CR)	\xXX  char with
-     \b Backspace (BS)	     \t Horizontal Tab (TAB)	      hex value XX
+     \\ 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
 
-    Illegitimate Tokens (only valid in strings): @ $ ?
+  * 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.
 
-   Operating environment (Unix)
+Numbers
 
-    Shell environment vars:
+    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)
 
-     PYTHONPATH:    dirs to be prepended to module search path; a la shell PATH
-     PYTHONSTARTUP: names path of file to be loaded on interactive startup
+Sequences
 
-    Internal (module sys) vars ('import sys' to refer to them):
+  * 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]
 
-     argv		- list of command and arguments passed to python script
-     builtin_module_names - list of names of modules compiled in to python
-   ( exc_* values are set only during handling of a raised exception)
-     exc_type		- type of exception being handled
-     exc_value		- exception's parameter ('raise's 2nd arg)
-     exc_traceback	- exception's traceback obj
-     exit(N)		- exit from python with status N, by raising SystemExit
-     exitfunc		- function hook, to be called on exit if set
-     last_type		- type of last unhandled exception
-     last_value		- value of last unhandled exception
-     last_traceback	- traceback of last unhandled exception
-     modules		- list of modules already loaded
-     path		- list of strings specifying module-load search path
-     ps1='>>>'		- string specifying primary prompt, iff interactive
-     ps2='...'		- string specifying secondary prompt, iff interactive
-     settrace		- system trace function, used by debuggers, etc
-     setprofile		- system profile function
-     stdin		- standard input file object
-     stdout		- standard output file object
-     stderr		- standard error file object
-     tracebacklimit=1000 - maximum number of traceback levels to print
+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'.
 
-     Objects - behaviors, special attributes, operations, statements, etc
-     ====================================================================
+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.
 
-    General object aspects
+Dictionaries (Mappings)
 
-     Boolean values and operators
+    Dictionary of length 0, 1, 2, etc:
+    {} {1 : 'first'} {1 : 'first',  'next': 'second'}
 
-      False values:	None, numeric zeros, empty sequences and mappings
-      True values:	all other values
+Operators and their evaluation order
 
-      not X: if X is false then 1, else 0
-    ( 'or', 'and' evaluate second arg only if necessary to determine outcome)
-      X or Y: if X is false then Y, else X
-      X and Y: if X is false then X, else Y
+                     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
 
-     Special methods for any type				(s: self)
+Alternate names are defined in module operator (e.g. __add__ and add for +)
+Most operators are overridable
 
-      id(obj)		unique identifier for object (currently, its address)
-      __init__(s, args)	object instantiation - see Classes, below
-      __del__(s)	object demise
-      __repr__(s)	repr() and `...` conversions
-      __str__(s)	str() and 'print' statement
-      __cmp__(s)	implements <, ==, >, <=, <>, !=, >=, is [not]
-      __hash__(s)	hash() and dictionary operations
 
-     Special informative state attributes for some types:
+Basic Types and Their Operations
 
-      X.__dict__	dict used to store object's writeable attributes
-      X.__methods__	list of X's methods; on many built-in types.
-      X.__members__	lists of X's data attributes
-      X.__class__	class to which X belongs
-      X.__bases__	tuple of X base classes
+Comparisons (defined between *any* types)
 
-     General Name Space behavior and binding
+               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).
 
-      Name space search order: local, global, builtin
+                              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.)
+()
 
-      "global" name space = file = module
-      "local" name space = function or method
 
-      Code Block scopes		(ns = name space, cb = containing block)
 
-     ( global ns generally is containing module, unless overriden by args)
+                                      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)
 
-       Code block type	Local ns		Notes
-       ---------------	--------		-----
-       Module		same as global ns
-       Script		same as global ns	global ns is __main__
-       Interactive cmd	same as global ns	global ns is __main__
-       Class def	new ns
-       Function body	new ns
-       'exec' string	local ns of cb	    (or args)
-       'eval' string	local ns of caller  (or args)
-       'execfile' file	local ns of caller  (or args)
-       'input' expr	local ns of caller
+                               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'
 
-      Binding operations and exceptions:
+                               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.
 
-     ~ SyntaxError: on attempt to bind to literals or other non-bindables
-     ~ NameError: on attempt to evaluate unbound atom
 
-     ( for object attribute functions, obj: object, nm: string, val: any value)
-       getattr(obj, nm)		get value of obj.nm
-       hasattr(obj, nm)		true if obj has nm attribute
-       setattr(obj, nm, val)	set obj.nm to val
 
-       assignment statement: 	targ1, targ2, ,,, = obj1, obj2, ,,,
-       deletion statement:	del obj1, obj2, ...
-       for loop target identifiers, 'except' clauses (see Statements, below)
-       formal params		(see Callables, below)
-       import statement		(see Modules objects, below)
-       class and func defs	(see Callables, below)
+                                     posix
+don't import this module directly, import os instead !
+(see also module: shutil for file copy & remove fcts)
 
-      Name space linkage
+                            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.
 
-       global statement: global var, ...	# Interpret 'var's as globals
-     X access statement: access ...	# control inst and class vars access
+                             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.
 
-   @ Built-in Exceptions
 
-      AttributeError	On attribute reference or assignment failure
-      EOFError		Immediate end-of-file hit by input() or raw_input()
-      IOError		I/O-related I/O operation failure
-      ImportError	On failure of `import' to find module or name
-      IndexError	On out-of-range sequence subscript
-      KeyError		On reference to a non-existent mapping (dict) key
-      KeyboardInterrupt	On user entry of the interrupt key (often `Control-C')
-      MemoryError	On recoverable memory exhaustion
-      NameError		On failure to find a local or global (unqualified) name
-      OverflowError	On excessively large arithmetic operation
-      RuntimeError	Obsolete catch-all; define a suitable error instead
-      SyntaxError	On parser encountering a syntax error
-      SystemError	On non-fatal interpreter error - bug - report it
-      SystemExit	On `sys.exit()'
-      TypeError		On passing inappropriate type to built-in op or func
-      ValueError	On arg error not covered by TypeError or more precise
-      ZeroDivisionError	On division or modulo operation with 0 as 2nd arg
 
-    			       **** Numbers ****
+                                   posixpath
+Do not import this module directly, import os instead and refer to this module
+as os.path. (e.g. os.path.exists(p)) !
 
-   @ Integers: 'C' long, >= 32 bits precision; OverflowError if bounds exceeded
-   @ Long Integers: unlimited precision - '2147483648L'
-   @ Floating point: machine double-precision floating point - '2147483648.0'
+                           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.
 
-     Numeric operations vs 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)
-      pow(s,o)	=  __pow__(s,o)
-      s&o	=  __and__(s,o)		
-      s^o	=  __xor__(s,o)		s|o	   =  __xor__(s,o)
-      s<<o	=  __lshift__(s,o)	s>>o	   =  __rshift__(s,o)
-      nonzero(s) = __nonzero__(s)	coerce(s,o) = __coerce__(s,o)
-      -s  	=  __neg__(s)		+s	   =  __pos__(s)  
-      abs(s)	=  __abs__(s)		~s	   =  __invert__(s)  (bitwise)
-      int(s)  	=  __int__(s)		long(s)	   =  __long__(s)
-      float(s)	=  __float__(s)
-      oct(s)  	=  __oct__(s)		hex(s)	   =  __hex__(s)
 
-     Numeric functions:
+                                    shutil
+high-level file operations (copying, deleting).
 
-      range(start=0,end,step=1)  create arithmetic progression list
-      round(x, n=0)		 round floating point x to n decimal places
-      xrange(start=0,end,step=1) create virtual arithmetic progressions tuple
+                             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
 
-     Numeric exceptions:
+(and also: copyfile, copymode, copystat, copy2)
 
-    ~ TypeError: raised on application of arithemetic opertion to non-number
-    ~ OverflowError: numeric bounds exceeded
-    ~ ZeroDivisionError: raised when zero second argument of div or modulo op
+time
 
-    		**** Collections - Sequences and Mappings ****
+                                  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
 
-     Collections general operations vs methods  (s: self, i: index or key)
+                                   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.
 
-      len(s)	= __len__(s)	    length of object, >= 0.  Length 0 == false
-      s[i]	= __getitem__(s,i)  Element at index/key i, origin 0
+and also: clock, ctime.
 
-     Sequences
+                                    string
 
-    @ String (immutable sequence): 'string contents'
+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.
 
-       'this is a string'
-       "and so is this"
-       ''' and this begins a 'multi-line' string with embedded quotes...
-       and this is the end of that string.'''
+                             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.
 
-       `expr`		= __repr__(expr), converts arbitrary expr to string
-       chr(int)	 	string of ascii letter at ordinate in (0 <= int < 256)
-       ord(string) 	ascii ordinate of string (string must be length 1)
-       string % arg	format operator, a la C sprintf
-         arg for single directive can be any (suitable) type
-         arg for multiple directives must be tuple or dict
-         dict (mapping) arg uses parenthesized directives that are keys into it
-         supports %, c, s, i, d, u, o, x, X, e, E, f, g, G directives
-         * can be width and precision; directs use of corresponding (int) args
-         * can not be used with dict args
-         flag characters -, +, blank, #, and 0 understood.
-         %s conversion takes any python object, converts using `str()'
-         ANSI directives %p and %n not supported
-         %s conversions do *not* take \000 as end of string
+                             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.
 
-    @ Tuples (immutable sequence): (oneelem, another, etc)
 
-       parens may be left off all but empty tuples
-       singletons represented by affixing a comma to an expr
-       empty tuple represented using empty parens
 
-    @ Lists (mutable sequence): [oneelem, another, etc]
+                                   re (sre)
 
-       assignment - must be 1-1 map of items in target and object sequences
-       deletion - similar rules as for assignment
+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.
 
-       List special methods: see mutable sequence ops vs methods, below
 
-      Sequences general ops vs methods	      (s: self, i,j: indices, v: val)
+                           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.
 
-       All collections general methods, plus:
-       s[i:j]	        __getslice__(s,i,j), all s[k] s.t. i <= k < j
-       min(s)		smallest item of s
-       max(s)		largest item of s
-       v [not] in s	1 if v [not] equal to an item in s, else 0
-       s + seq		concatenation of s and seq
-       s * num		num copies of s concatenated, also, `num * s'
+                               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
 
-      Immutable sequence ops vs methods     (s: self, i,j: indices, v: val)
+                         Variables
+Variable                       Meaning
+error    Exception when pattern string isn't a valid regexp.
 
-       All collections and sequences general methods, plus:
-       s[i:j]	        __getslice__(s,i,j), all s[k] s.t. i <= k < j
-     ( For s[i:j], len(self) is intrinsically added to i, j < 0)
-     ( Complex elems of immutable seqs may be mutable, see dictionaries, below)
+                                   Functions
+   Function                                 Result
+               Compile a RE pattern string into a regular expression object.
+               Flags (combinable by |):
 
-      Mutable sequence ops vs methods	      (s: self, i,j: indices, v: val)
+               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])
 
-       All sequences' general methods, plus:
-     ( for non-slice refs, i < 0 intrinsically has len(s) added)
-     ( For slice refs, len(s) *is not* intrinsically added to i, j < 0)
-     ( for assignment/deletion, index refs must point to existing items
-       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] = []
-       s.append(seq)	== `s[len(seq):len(seq)] = seq'	(but faster)
-       s.count(v)	number of i's for which `s[i] == v'
-       s.index(v)	first i such that `s[i] == v', or IndexError if none
-       s.insert(i, v)	== `s[i:i] = [v]'
-       s.remove(v)	== `del s[s.index(v)]', or IndexError if v not in s
-       s.reverse()	reverse the items of s in place
-       s.sort()		permute s items so s[i] <= s[j], for i < j
+Regular Expression Objects
 
-     Mappings
 
-    @ Dictionaries: {key1: val1, key2: val2, ...}
+(RE objects are returned by the compile fct)
 
-       built-in types as keys must be unalterable: obj & all contents immutable
-       User-defined classes as keys must have __hash__() and __cmp__() methods
-     ~ TypeError is raised if key not acceptable
-     ~ KeyError is raised if reference made using non-existent key
-       key types may vary (contrary to ref man)
+                          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
 
-      Dictionaries ops vs methods		(s: self, k: key, v: val)
+                               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])
 
-       all collections general ops, plus:
-       hash(s)		= __hash__(s) - hash value for dictionary references
-       s[k]=v		= __setitem__(s,k,v)
-       del s[k]		= __delitem__(s,k)
-       s.items()	= a list copy of s's (key, item) pairs
-       s.keys()		= a list copy of s's keys
-       s.values()	= a list copy of s's values
-       s.has_keys(k)	= 1 if s has key k, else 0
-     ( s.items, .keys, and .values yield random but mutually consistent order)
+Match Objects
 
-    			      **** Callables ****
 
-   @ User defined functions: 'def name (param-list): suite'
+(Match objects are returned by the match & search functions)
 
-      suite is not evaluated at statement execution, but at function invocation
-      function parameters, comma separated on param-list:
-      func_code: special attr, code object representing compiled function body
-      func_globals: special attr, ref to global dict of funcs definition module
-      func(arg-list)	invocation
+                            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()
 
-   @ User defined methods: like functions, with extra implicit arg
+                            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.
 
-      Same as functions, but passed class instance as additional first argument
-      im_self: special attr, method's class instance object
-      im_func: special attr, function object
-      mthd(args)	invocation, same as mthd.im_func(mthd.im_self, args)
 
-   @ Classes: 'class name[ (inheritance)]: suite'
 
-      inheritance list is evaluated, if any, to identify base classes for name
-      suite is executed in new local name space, which goes to the class object
-      class name is bound in encompassing local name space
-      container for dictionary containing class's ns dictionary
-      __dict__: ro attr, class ns as dictionary object
-      __bases__: ro attr, class' base classes in tuple
-      __init__(self, args..): implements object instantiation
-      __del__(self): implements impending object deletion
+                                     math
 
-   @ Class instances
+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)
 
-      __dict__: ro attr, class' attribute dictionary
-      __class__: ro attr, instance's class object
+                                    getopt
 
-     Callables special method vs ops		(f: function)
+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']
 
-      apply(f, args-tuple)	call f with args-tuple as arg list
-      compile(str, flnm, kind)	compile string into exectuable code object
-      eval(str, glbls=, lcls=)	evaluate string as expression (cond_list)
-      filter(f, seq)		=> seq of seq elems for which f is true
-      map(f, lst, [lst2, ...])	=> list of f applied to succesive lsts elems
-      reduce(f, lst, initlzr)	=> value of f applied to elems and cume result
 
-  @ 			 **** Null object: `None' ****
+List of modules and packages in base distribution
 
-  @		**** Type objects, print as: <type 'int'> ****
-   ( '<...>' form is only for printing - cannot be entered that way,
+(built-ins and content of python Lib directory)
+(Python NT distribution, may be slightly different in other distributions)
 
-     accessed via built-in func 'type()'
-   ( equal only when identical (same id()),
-     so can't just use the string name, must use object with the same str val)
+                           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]
 
-  @ 			       **** Modules ****
 
-     functions and methods in a module share module's ("global") namespace
-     function uses "global" statement to instantiate var in global context
-     Modules use "import" to incorp other module's names - see Name Spaces
 
-     Special attrs, methods, and operations
+(following list not revised)
 
-      __dict__: attr, module's ns as dictionary; can modify vals but not sruct
-      __name__: ro attr, module's name as string
-      import		Instantiate module or module components within another
-      reload(amod)	Reread an imported module
+* Built-ins *
 
-  @ 				**** Files ****
+            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
 
-     wrapper around a C stdio file pointer
-     sys.stdin, sys.stdout, sys.stderr are standard io-stream file objects
+* Standard *
 
-     File operations:
+            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.
 
-       open(nm, mode='r', bufsize=sysdef)    return new file object
-       close()		A closed file cannot be read or written anymore.
-       flush()		Flush the internal buffer, like stdio's `fflush()'.
-       isatty()		1 if file connected to a tty(-like) device, else 0.
-       read(SIZE) 	Read up to SIZE bytes frm file, less on EOF or no data
-       readline()	Read one entire line from the file.
-       readlines() 	`readline()' til EOF and return list  of lines read.
-       seek(OFFSET,WHENCE) Set file's current position, like stdio's `fseek()'
-       tell()		Return file's current position, like stdio's `ftell()'.
-       write(STR)	Write a string to the file.  There is no return value.
+* Unix/Posix *
 
-     File functions:
+            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
 
-      input(prompt='')	     like raw input but accept '\' line continuations
-      print exp, exp2, ...  Write values to stdout
-      raw_input(prompt='')   prompt then read single line of input
+* Tk User-interface Toolkit *
 
-    			    **** Internal types ****
+            tkinter             Main interface to Tk
 
-   @ Code objects - represent exectuable code - function obj sans context
-   @ Frame objects - represent executable frames - may occur in traceback objs
-   @ Traceback objects - stack trace of an exception
+* Multimedia *
 
-   			      Control statements
-			      ==================
+            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
 
-    		           * Calls and Evaluation *
+* Cryptographic Extensions *
 
-   ( See also Callables, in Objects section above, for ops and methods.)
+            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
 
-     exec: exec expr [ in expr2 [, expr3]]  # Dynamic execution of python code
-     return: return [expr]	# Leave current func call with expr value
+* Stdwin * Standard Window System
 
-    			  * Conditionals and Loops *
-   (			See also Boolean values, above)
+            stdwin              Standard Window System interface
+            stdwinevents        Stdwin event, command, and selection constants
+            rect                Rectangle manipulation operations
 
-     break: break		# Terminate nearest enclosing loop
-     continue: continue		# Continue next cycle of enclosing loop
-     if:	if cond: suite [\n elif cond: suite \n ...] [\n else: suite]
-     for:	for targs in conds: suite [ \n else: suite ]
-     while:	while cond: suite [ \n else : suite ]
+* SGI IRIX * (4 & 5)
 
-    				 * Exceptions *
+            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
 
-     raise: raise expr [, expr2]   # Raise exception expr, passing expr2 if any
-     try...			# Handle exceptions:
-     try: suite [\n except [cond [, targ]]: suite \n ... \n] [else: suite]
-     try: suite \n finally: suite	# Specify a 'cleanup' handler
-   ( two 'try' forms cannot be mixed together)
+* Suns *
 
-   				System modules
-				==============
-  @			 	 * Built-ins *
+            sunaudiodev Access to sun audio interface
 
-     sys		Interpreter state (see Operating Environment, above)
-     __builtin__	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
-     strop		Miscellaneous string operations
-     struct		Convert between python values and C structs
 
-  @ 				 * Standard *
+Workspace exploration and idiom hints
 
-     getopt		Parse cmd line args in sys.argv.  A la UNIX 'getopt'.
-     os			Portable interface to OS dependent functionality
-     pdb		text-oriented debugger
-     rand		Pseudo-random generator, like C rand()
-     regsub		Functions useful for working with regular expressions
-     string		Useful string and characters functions and exceptions
-     wdb		window-oriented debugger
-     whrandom		Wichmann-Hill pseudo-random number generator
+        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
 
-  @			       * Miscellaneous *
 
-     dis		Python disassembler
-     glob		Filename globbing (a la unix shell)
-     grep		File string search
-     posixpath		Common operations on POSIX pathnames
-     profile		Python code profiler
-     repr		`...` repr operator with presentation constraints
-     string		All of builtin 'strop', plus
-     tb			Traceback browser and printer
-     tempfile		Produce a temporary-file name
-     util		Miscellaneous functions that don't belong elsewhere
 
-  @ 				   * Unix *
 
-     dbm		Dict/file-like interface to Unix ndbm database library
-     grp		Interface to Unix group database
-     posix		Standardized UNIX OS functionality - see 'os', above
-     posixpath		POSIX pathname functions - see 'os', above
-     pwd		Access to the Unix password database
-     select		Access to Unix select multiplex file synchronization
-     socket		Access to BSD socket interface
-     thread		Low-level primitives for working with process threads
 
-  @ 				* 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 *
+Python Mode for Emacs
 
-     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
+(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
 
-  @ 				  * Stdwin *	Standard Window System
 
-     stdwin		Standard Window System interface
-     stdwinevents	Stdwin event, command, and selection constants
-     rect		Rectangle manipulation operations
+The Python Debugger
 
-  @ 				 * SGI IRIX * (4 & 5)
+(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)
 
-     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
+Accessing
 
-  @ 				   * Suns *
+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>
 
-     sunaudiodev	Access to sun audio interface
+        -- defines class Pdb :
+           use Pdb to create reusable debugger objects. Object
+           preserves state (i.e. break points) between calls.
 
-  @ 				  * Contrib *
+        runs until a breakpoint hit, exception, or end of program
+        If exception, variable '__exception__' holds (exception,value).
 
-     syslog
+Commands
 
-     metalbase
+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.
 
-   			       Idioms and hints
-			       ================
+Example
 
-    Invoke main if running as script:	     if __name__ == '__main__': main()
+(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.
 
-    General object-type miscellany
-     What type is someobj; eg, a list:	     if type(someobj) == type([]):
-     Convert number to hex or octal string:  hex(122)	  => '0x7a'
-     Convert string to number:		     eval('0x7a') => 122
+Quirks
 
-    Sequence Slice conceptualization:
-       +---+---+---+---+---+		     Indices point ~between~ chars:
-       | s | t | u | f | f |		      - first char's left edge = 0,
-       +---+---+---+---+---+		      - nth char's right edge = n.
-       0   1   2   3   4   5		     (Note that -0 == 0, so it does
-      -5  -4  -3  -2  -1		      not count from right.)
+Breakpoints are stored as filename, line number tuples. If a module is reloaded
+after editing, any remembered breakpoints are likely to be wrong.
 
-    Sequences miscellany:
-     Create merge of lists:		     map(None, lst1, lst2, ...)
-     It's faster to list.append(elem) than to list[len(list):] = [elem]
-     Copy structure of seq a to b:	     b = a[:]
+Always single-steps through top-most stack frame. That is, "c" acts like "n".
 
-    Comma (tuple vs expression grouping) nuances:
-     to specify a tuple of one element:	     ('element',)
-     to specify a tuple containing 1 tuple: (('contained', 'tuple'),)
-     "TypeError: call of non-function" often means a list missing a comma
 
-    Namespace and object surveillance:
-     get dictful object keys/key-vals:	     dir(), vars()
-     Current context globals:		     eval(__name__ + '.__dict__')
-     Current context locals:		     vars()
-     Methods supported by X (some objs):     X.__methods__	
-     X's data attributes (some objs):	     X.__members__	
