 			  A Python Bestiary
		 Itemizing Python Objects and Nuances

   $Revision$ $Date$ 	ken.manheimer@nist.gov

  			   Notable lexical entities
			   ========================

    Keywords

     	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

    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

    Illegitimate Tokens (only valid in strings): @ $ ?

   Operating environment (Unix)

    Shell environment vars:

     PYTHONPATH:    dirs to be prepended to module search path; a la shell PATH
     PYTHONSTARTUP: names path of file to be loaded on interactive startup

    Internal (module sys) vars ('import sys' to refer to them):

     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


     Objects - behaviors, special attributes, operations, statements, etc
     ====================================================================

    General object aspects

     Boolean values and operators

      False values:	None, numeric zeros, empty sequences and mappings
      True values:	all other values

      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

     Special methods for any type				(s: self)

      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:

      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

     General Name Space behavior and binding

      Name space search order: local, global, builtin

      "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)

       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

      Binding operations and exceptions:

     ~ 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)

      Name space linkage

       global statement: global var, ...	# Interpret 'var's as globals
     X access statement: access ...	# control inst and class vars access

   @ 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 ****

   @ Integers: 'C' long, >= 32 bits precision; OverflowError if bounds exceeded
   @ Long Integers: unlimited precision - '2147483648L'
   @ Floating point: machine double-precision floating point - '2147483648.0'

     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:

      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

     Numeric exceptions:

    ~ 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

    		**** Collections - Sequences and Mappings ****

     Collections general operations vs methods  (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

    @ String (immutable sequence): 'string contents'

       '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.'''

       `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

    @ 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]

       assignment - must be 1-1 map of items in target and object sequences
       deletion - similar rules as for assignment

       List special methods: see mutable sequence ops vs methods, below

      Sequences general ops vs methods	      (s: self, i,j: indices, v: val)

       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'

      Immutable sequence ops vs methods     (s: self, i,j: indices, v: val)

       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)

      Mutable sequence ops vs methods	      (s: self, i,j: indices, v: val)

       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

     Mappings

    @ Dictionaries: {key1: val1, key2: val2, ...}

       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)

      Dictionaries ops vs methods		(s: self, k: key, v: val)

       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)

    			      **** Callables ****

   @ User defined functions: 'def name (param-list): suite'

      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

   @ User defined methods: like functions, with extra implicit arg

      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

   @ Class instances

      __dict__: ro attr, class' attribute dictionary
      __class__: ro attr, instance's class object

     Callables special method vs ops		(f: function)

      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' ****

  @		**** Type objects, print as: <type 'int'> ****
   ( '<...>' form is only for printing - cannot be entered that way,

     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)

  @ 			       **** 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

      __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

  @ 				**** Files ****

     wrapper around a C stdio file pointer
     sys.stdin, sys.stdout, sys.stderr are standard io-stream file objects

     File operations:

       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.

     File functions:

      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

    			    **** Internal types ****

   @ 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

   			      Control statements
			      ==================

    		           * Calls and Evaluation *

   ( See also Callables, in Objects section above, for ops and methods.)

     exec: exec expr [ in expr2 [, expr3]]  # Dynamic execution of python code
     return: return [expr]	# Leave current func call with expr value

    			  * Conditionals and Loops *
   (			See also Boolean values, above)

     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 ]

    				 * Exceptions *

     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)

   				System modules
				==============
  @			 	 * Built-ins *

     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 *

     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

  @			       * 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 *

     md5		Interface to RSA's MD5 message digest algorithm
     mpz		Interface to int part of GNU multiple precision library
     rotor		Implementation of a rotor-based encryption algorithm

  @ 				  * Stdwin *	Standard Window System

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

  @ 				 * SGI IRIX * (4 & 5)

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

  @ 				   * Suns *

     sunaudiodev	Access to sun audio interface

  @ 				  * Contrib *

     syslog

     metalbase

   			       Idioms and hints
			       ================

    Invoke main if running as script:	     if __name__ == '__main__': main()

    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

    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.)

    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[:]

    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__	
