{
 "metadata": {
  "name": "Python basics, loose ends"
 }, 
 "nbformat": 2, 
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# patching objects and classes", 
      "class Point(object):", 
      "    def __init__(self, x, y):", 
      "        self.x=x", 
      "        self.y=y", 
      "        ", 
      "x1, x2 = Point(1,1), Point(2,3)", 
      "x1.distance(x2)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "AttributeError", 
       "evalue": "'Point' object has no attribute 'distance'", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)", 
        "\u001b[1;32m/home/stef/tasks/pywik/<ipython-input-57-33ec3dd8f686>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      6\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      7\u001b[0m \u001b[0mx1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx2\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mPoint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m3\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 8\u001b[1;33m \u001b[0mx1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 
        "\u001b[1;31mAttributeError\u001b[0m: 'Point' object has no attribute 'distance'"
       ]
      }
     ], 
     "prompt_number": 57
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "def distance(self,other):", 
      "    return sqrt((self.x-other.x)**2 + (self.y-other.y)**2)", 
      "x1.distance=distance", 
      "x1.distance(x2)", 
      "x2.distance(x1)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "TypeError", 
       "evalue": "distance() takes exactly 2 arguments (1 given)", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)", 
        "\u001b[1;32m/home/stef/tasks/pywik/<ipython-input-58-46a472ba9b4e>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      2\u001b[0m     \u001b[1;32mreturn\u001b[0m \u001b[0msqrt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mx\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;33m(\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m-\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0my\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m**\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[0mx1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mx1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m      5\u001b[0m \u001b[0mx2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 
        "\u001b[1;31mTypeError\u001b[0m: distance() takes exactly 2 arguments (1 given)"
       ]
      }
     ], 
     "prompt_number": 58
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "import types", 
      "x1.distance=types.MethodType(distance,x1)", 
      "print x1.distance(x2)", 
      "x2.distance(x1)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "AttributeError", 
       "evalue": "'Point' object has no attribute 'distance'", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)", 
        "\u001b[1;32m/home/stef/tasks/pywik/<ipython-input-59-912a83b2e327>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[0mx1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtypes\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mMethodType\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mx1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      3\u001b[0m \u001b[1;32mprint\u001b[0m \u001b[0mx1\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mx2\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdistance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mx1\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 
        "\u001b[1;31mAttributeError\u001b[0m: 'Point' object has no attribute 'distance'"
       ]
      }, 
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "2.2360679775"
       ]
      }
     ], 
     "prompt_number": 59
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "Point.distance=distance", 
      "x2.distance(x1)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 60, 
       "text": [
        "2.2360679774997898"
       ]
      }
     ], 
     "prompt_number": 60
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# decorators http://wiki.python.org/moin/PythonDecorators", 
      "# http://stackoverflow.com/questions/739654/understanding-python-decorators", 
      "def hello(name=\"World\"):", 
      "    return \"Hello %s!\" % name", 
      "print hello()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "Hello World!"
       ]
      }
     ], 
     "prompt_number": 61
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "import hashlib", 
      "print '0'", 
      "def hashed(func):", 
      "    print \"hashed1\"", 
      "    def wrapped():", 
      "        print \"wrapped1\"", 
      "        res=func()", 
      "        return (res,hashlib.md5(res).hexdigest())", 
      "    print \"hashed2\"", 
      "    return wrapped", 
      "print '1'", 
      "@hashed", 
      "def hashedhello(name=\"World\"):", 
      "    print \"hhello1\"", 
      "    return \"Hello %s!\" % name", 
      "print '2'", 
      "print hashedhello()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "0", 
        "1", 
        "hashed1", 
        "hashed2", 
        "2", 
        "wrapped1", 
        "hhello1", 
        "('Hello World!', 'ed076287532e86365e841e92bfc50d8c')"
       ]
      }
     ], 
     "prompt_number": 63
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "import hmac", 
      "def authd(key):", 
      "    def decor(func):", 
      "        def wrapped():", 
      "            res=func()", 
      "            return (res,hmac.new(key,res).hexdigest())", 
      "        return wrapped", 
      "    return decor", 
      "", 
      "@authd(\"secret\")", 
      "def authdhello(name=\"World\"):", 
      "    return \"Hello %s!\" % name", 
      "", 
      "print authdhello()"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "('Hello World!', '09185d5e4c0a674aa431cb8411e327ad')"
       ]
      }
     ], 
     "prompt_number": 64
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "def autokey(key):", 
      "    def decor(func):", 
      "        def wrapped(*args,**kwargs):", 
      "            res=func(*args,**kwargs)", 
      "            return ''.join([chr(ord(k)+ord(p))for k,p in zip(key+res,res)])", 
      "        return wrapped", 
      "    return decor", 
      "", 
      "@autokey(\"secret\")", 
      "def secrethello(name=\"World\"):", 
      "    return \"Hello %s!\" % name", 
      "", 
      "msg=secrethello(name=\"python\")", 
      "print repr(msg)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "'\\xbb\\xca\\xcf\\xde\\xd4\\x94\\xb8\\xde\\xe0\\xd4\\xde\\x8e\\x91'"
       ]
      }
     ], 
     "prompt_number": 65
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "def dekey(key, ct):", 
      "    res=key[:]", 
      "    for i, c in enumerate(ct):", 
      "        res=\"%s%s\" % (res,chr(ord(c)-ord(res[i])))", 
      "    return res[len(key):]", 
      "", 
      "print dekey('secret', secrethello(\"python\"))"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "Hello python!"
       ]
      }
     ], 
     "prompt_number": 66
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "# see modules demos in hackerspace/python101", 
      "dir(sys)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "pyout", 
       "prompt_number": 67, 
       "text": [
        "['__displayhook__',", 
        " '__doc__',", 
        " '__egginsert',", 
        " '__excepthook__',", 
        " '__name__',", 
        " '__package__',", 
        " '__plen',", 
        " '__stderr__',", 
        " '__stdin__',", 
        " '__stdout__',", 
        " '_clear_type_cache',", 
        " '_current_frames',", 
        " '_getframe',", 
        " '_mercurial',", 
        " 'api_version',", 
        " 'argv',", 
        " 'builtin_module_names',", 
        " 'byteorder',", 
        " 'call_tracing',", 
        " 'callstats',", 
        " 'copyright',", 
        " 'displayhook',", 
        " 'dont_write_bytecode',", 
        " 'exc_clear',", 
        " 'exc_info',", 
        " 'exc_type',", 
        " 'excepthook',", 
        " 'exec_prefix',", 
        " 'executable',", 
        " 'exit',", 
        " 'exitfunc',", 
        " 'flags',", 
        " 'float_info',", 
        " 'float_repr_style',", 
        " 'getcheckinterval',", 
        " 'getdefaultencoding',", 
        " 'getdlopenflags',", 
        " 'getfilesystemencoding',", 
        " 'getprofile',", 
        " 'getrecursionlimit',", 
        " 'getrefcount',", 
        " 'getsizeof',", 
        " 'gettrace',", 
        " 'hexversion',", 
        " 'last_traceback',", 
        " 'last_type',", 
        " 'last_value',", 
        " 'long_info',", 
        " 'maxint',", 
        " 'maxsize',", 
        " 'maxunicode',", 
        " 'meta_path',", 
        " 'modules',", 
        " 'path',", 
        " 'path_hooks',", 
        " 'path_importer_cache',", 
        " 'platform',", 
        " 'prefix',", 
        " 'py3kwarning',", 
        " 'pydebug',", 
        " 'real_prefix',", 
        " 'setcheckinterval',", 
        " 'setdlopenflags',", 
        " 'setprofile',", 
        " 'setrecursionlimit',", 
        " 'settrace',", 
        " 'stderr',", 
        " 'stdin',", 
        " 'stdout',", 
        " 'subversion',", 
        " 'version',", 
        " 'version_info',", 
        " 'warnoptions']"
       ]
      }
     ], 
     "prompt_number": 67
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "help(sys)"
     ], 
     "language": "python", 
     "outputs": [
      {
       "output_type": "stream", 
       "stream": "stdout", 
       "text": [
        "Help on built-in module sys:", 
        "", 
        "NAME", 
        "    sys", 
        "", 
        "FILE", 
        "    (built-in)", 
        "", 
        "MODULE DOCS", 
        "    http://docs.python.org/library/sys", 
        "", 
        "DESCRIPTION", 
        "    This module provides access to some objects used or maintained by the", 
        "    interpreter and to functions that interact strongly with the interpreter.", 
        "    ", 
        "    Dynamic objects:", 
        "    ", 
        "    argv -- command line arguments; argv[0] is the script pathname if known", 
        "    path -- module search path; path[0] is the script directory, else ''", 
        "    modules -- dictionary of loaded modules", 
        "    ", 
        "    displayhook -- called to show results in an interactive session", 
        "    excepthook -- called to handle any uncaught exception other than SystemExit", 
        "      To customize printing in an interactive session or to install a custom", 
        "      top-level exception handler, assign other functions to replace these.", 
        "    ", 
        "    exitfunc -- if sys.exitfunc exists, this routine is called when Python exits", 
        "      Assigning to sys.exitfunc is deprecated; use the atexit module instead.", 
        "    ", 
        "    stdin -- standard input file object; used by raw_input() and input()", 
        "    stdout -- standard output file object; used by the print statement", 
        "    stderr -- standard error object; used for error messages", 
        "      By assigning other file objects (or objects that behave like files)", 
        "      to these, it is possible to redirect all of the interpreter's I/O.", 
        "    ", 
        "    last_type -- type of last uncaught exception", 
        "    last_value -- value of last uncaught exception", 
        "    last_traceback -- traceback of last uncaught exception", 
        "      These three are only available in an interactive session after a", 
        "      traceback has been printed.", 
        "    ", 
        "    exc_type -- type of exception currently being handled", 
        "    exc_value -- value of exception currently being handled", 
        "    exc_traceback -- traceback of exception currently being handled", 
        "      The function exc_info() should be used instead of these three,", 
        "      because it is thread-safe.", 
        "    ", 
        "    Static objects:", 
        "    ", 
        "    float_info -- a dict with information about the float inplementation.", 
        "    long_info -- a struct sequence with information about the long implementation.", 
        "    maxint -- the largest supported integer (the smallest is -maxint-1)", 
        "    maxsize -- the largest supported length of containers.", 
        "    maxunicode -- the largest supported character", 
        "    builtin_module_names -- tuple of module names built into this interpreter", 
        "    version -- the version of this interpreter as a string", 
        "    version_info -- version information as a named tuple", 
        "    hexversion -- version information encoded as a single integer", 
        "    copyright -- copyright notice pertaining to this interpreter", 
        "    platform -- platform identifier", 
        "    executable -- absolute path of the executable binary of the Python interpreter", 
        "    prefix -- prefix used to find the Python library", 
        "    exec_prefix -- prefix used to find the machine-specific Python library", 
        "    float_repr_style -- string indicating the style of repr() output for floats", 
        "    __stdin__ -- the original stdin; don't touch!", 
        "    __stdout__ -- the original stdout; don't touch!", 
        "    __stderr__ -- the original stderr; don't touch!", 
        "    __displayhook__ -- the original displayhook; don't touch!", 
        "    __excepthook__ -- the original excepthook; don't touch!", 
        "    ", 
        "    Functions:", 
        "    ", 
        "    displayhook() -- print an object to the screen, and save it in __builtin__._", 
        "    excepthook() -- print an exception and its traceback to sys.stderr", 
        "    exc_info() -- return thread-safe information about the current exception", 
        "    exc_clear() -- clear the exception state for the current thread", 
        "    exit() -- exit the interpreter by raising SystemExit", 
        "    getdlopenflags() -- returns flags to be used for dlopen() calls", 
        "    getprofile() -- get the global profiling function", 
        "    getrefcount() -- return the reference count for an object (plus one :-)", 
        "    getrecursionlimit() -- return the max recursion depth for the interpreter", 
        "    getsizeof() -- return the size of an object in bytes", 
        "    gettrace() -- get the global debug tracing function", 
        "    setcheckinterval() -- control how often the interpreter checks for events", 
        "    setdlopenflags() -- set the flags to be used for dlopen() calls", 
        "    setprofile() -- set the global profiling function", 
        "    setrecursionlimit() -- set the max recursion depth for the interpreter", 
        "    settrace() -- set the global debug tracing function", 
        "", 
        "FUNCTIONS", 
        "    __displayhook__ = displayhook(...)", 
        "        displayhook(object) -> None", 
        "        ", 
        "        Print an object to sys.stdout and also save it in __builtin__._", 
        "    ", 
        "    __excepthook__ = excepthook(...)", 
        "        excepthook(exctype, value, traceback) -> None", 
        "        ", 
        "        Handle an exception by displaying it with a traceback on sys.stderr.", 
        "    ", 
        "    call_tracing(...)", 
        "        call_tracing(func, args) -> object", 
        "        ", 
        "        Call func(*args), while tracing is enabled.  The tracing state is", 
        "        saved, and restored afterwards.  This is intended to be called from", 
        "        a debugger from a checkpoint, to recursively debug some other code.", 
        "    ", 
        "    callstats(...)", 
        "        callstats() -> tuple of integers", 
        "        ", 
        "        Return a tuple of function call statistics, if CALL_PROFILE was defined", 
        "        when Python was built.  Otherwise, return None.", 
        "        ", 
        "        When enabled, this function returns detailed, implementation-specific", 
        "        details about the number of function calls executed. The return value is", 
        "        a 11-tuple where the entries in the tuple are counts of:", 
        "        0. all function calls", 
        "        1. calls to PyFunction_Type objects", 
        "        2. PyFunction calls that do not create an argument tuple", 
        "        3. PyFunction calls that do not create an argument tuple", 
        "           and bypass PyEval_EvalCodeEx()", 
        "        4. PyMethod calls", 
        "        5. PyMethod calls on bound methods", 
        "        6. PyType calls", 
        "        7. PyCFunction calls", 
        "        8. generator calls", 
        "        9. All other calls", 
        "        10. Number of stack pops performed by call_function()", 
        "    ", 
        "    exc_clear(...)", 
        "        exc_clear() -> None", 
        "        ", 
        "        Clear global information on the current exception.  Subsequent calls to", 
        "        exc_info() will return (None,None,None) until another exception is raised", 
        "        in the current thread or the execution stack returns to a frame where", 
        "        another exception is being handled.", 
        "    ", 
        "    exc_info(...)", 
        "        exc_info() -> (type, value, traceback)", 
        "        ", 
        "        Return information about the most recent exception caught by an except", 
        "        clause in the current stack frame or in an older stack frame.", 
        "    ", 
        "    exit(...)", 
        "        exit([status])", 
        "        ", 
        "        Exit the interpreter by raising SystemExit(status).", 
        "        If the status is omitted or None, it defaults to zero (i.e., success).", 
        "        If the status is numeric, it will be used as the system exit status.", 
        "        If it is another kind of object, it will be printed and the system", 
        "        exit status will be one (i.e., failure).", 
        "    ", 
        "    getcheckinterval(...)", 
        "        getcheckinterval() -> current check interval; see setcheckinterval().", 
        "    ", 
        "    getdefaultencoding(...)", 
        "        getdefaultencoding() -> string", 
        "        ", 
        "        Return the current default string encoding used by the Unicode ", 
        "        implementation.", 
        "    ", 
        "    getdlopenflags(...)", 
        "        getdlopenflags() -> int", 
        "        ", 
        "        Return the current value of the flags that are used for dlopen calls.", 
        "        The flag constants are defined in the ctypes and DLFCN modules.", 
        "    ", 
        "    getfilesystemencoding(...)", 
        "        getfilesystemencoding() -> string", 
        "        ", 
        "        Return the encoding used to convert Unicode filenames in", 
        "        operating system filenames.", 
        "    ", 
        "    getprofile(...)", 
        "        getprofile()", 
        "        ", 
        "        Return the profiling function set with sys.setprofile.", 
        "        See the profiler chapter in the library manual.", 
        "    ", 
        "    getrecursionlimit(...)", 
        "        getrecursionlimit()", 
        "        ", 
        "        Return the current value of the recursion limit, the maximum depth", 
        "        of the Python interpreter stack.  This limit prevents infinite", 
        "        recursion from causing an overflow of the C stack and crashing Python.", 
        "    ", 
        "    getrefcount(...)", 
        "        getrefcount(object) -> integer", 
        "        ", 
        "        Return the reference count of object.  The count returned is generally", 
        "        one higher than you might expect, because it includes the (temporary)", 
        "        reference as an argument to getrefcount().", 
        "    ", 
        "    getsizeof(...)", 
        "        getsizeof(object, default) -> int", 
        "        ", 
        "        Return the size of object in bytes.", 
        "    ", 
        "    gettrace(...)", 
        "        gettrace()", 
        "        ", 
        "        Return the global debug tracing function set with sys.settrace.", 
        "        See the debugger chapter in the library manual.", 
        "    ", 
        "    setcheckinterval(...)", 
        "        setcheckinterval(n)", 
        "        ", 
        "        Tell the Python interpreter to check for asynchronous events every", 
        "        n instructions.  This also affects how often thread switches occur.", 
        "    ", 
        "    setdlopenflags(...)", 
        "        setdlopenflags(n) -> None", 
        "        ", 
        "        Set the flags used by the interpreter for dlopen calls, such as when the", 
        "        interpreter loads extension modules.  Among other things, this will enable", 
        "        a lazy resolving of symbols when importing a module, if called as", 
        "        sys.setdlopenflags(0).  To share symbols across extension modules, call as", 
        "        sys.setdlopenflags(ctypes.RTLD_GLOBAL).  Symbolic names for the flag modules", 
        "        can be either found in the ctypes module, or in the DLFCN module. If DLFCN", 
        "        is not available, it can be generated from /usr/include/dlfcn.h using the", 
        "        h2py script.", 
        "    ", 
        "    setprofile(...)", 
        "        setprofile(function)", 
        "        ", 
        "        Set the profiling function.  It will be called on each function call", 
        "        and return.  See the profiler chapter in the library manual.", 
        "    ", 
        "    setrecursionlimit(...)", 
        "        setrecursionlimit(n)", 
        "        ", 
        "        Set the maximum depth of the Python interpreter stack to n.  This", 
        "        limit prevents infinite recursion from causing an overflow of the C", 
        "        stack and crashing Python.  The highest possible limit is platform-", 
        "        dependent.", 
        "    ", 
        "    settrace(...)", 
        "        settrace(function)", 
        "        ", 
        "        Set the global debug tracing function.  It will be called on each", 
        "        function call.  See the debugger chapter in the library manual.", 
        "", 
        "DATA", 
        "    __stderr__ = <open file '<stderr>', mode 'w'>", 
        "    __stdin__ = <open file '<stdin>', mode 'r'>", 
        "    __stdout__ = <open file '<stdout>', mode 'w'>", 
        "    api_version = 1013", 
        "    argv = ['-c', '-f', '/home/stef/.ipython/profile_default/security/kern...", 
        "    builtin_module_names = ('__builtin__', '__main__', '_ast', '_bisect', ...", 
        "    byteorder = 'little'", 
        "    copyright = 'Copyright (c) 2001-2012 Python Software Foundati...ematis...", 
        "    displayhook = <IPython.zmq.displayhook.ZMQShellDisplayHook object>", 
        "    dont_write_bytecode = False", 
        "    exc_value = TypeError(\"<module 'sys' (built-in)> is a built-in module\"...", 
        "    exec_prefix = '/home/stef/tasks/pywik/env'", 
        "    executable = '/home/stef/tasks/pywik/env/bin/python'", 
        "    flags = sys.flags(debug=0, py3k_warning=0, division_warn...unicode=0, ...", 
        "    float_info = sys.float_info(max=1.7976931348623157e+308, max_...epsilo...", 
        "    float_repr_style = 'short'", 
        "    hexversion = 34014146", 
        "    last_value = AttributeError(\"'module' object has no attribute '__main_...", 
        "    long_info = sys.long_info(bits_per_digit=15, sizeof_digit=2)", 
        "    maxint = 2147483647", 
        "    maxsize = 2147483647", 
        "    maxunicode = 1114111", 
        "    meta_path = []", 
        "    modules = {'ConfigParser': <module 'ConfigParser' from '/usr/lib/pytho...", 
        "    path = ['', '/home/stef/tasks/pywik/env/lib/python2.7/site-packages/di...", 
        "    path_hooks = [<type 'zipimport.zipimporter'>]", 
        "    path_importer_cache = {'': None, '/home/stef/.ipython/extensions': <im...", 
        "    platform = 'linux2'", 
        "    prefix = '/home/stef/tasks/pywik/env'", 
        "    py3kwarning = False", 
        "    pydebug = False", 
        "    real_prefix = '/usr'", 
        "    stderr = <IPython.zmq.iostream.OutStream object>", 
        "    stdin = <open file '<stdin>', mode 'r'>", 
        "    stdout = <IPython.zmq.iostream.OutStream object>", 
        "    subversion = ('CPython', '', '')", 
        "    version = '2.7.3rc2 (default, Apr 22 2012, 22:35:38) \\n[GCC 4.6.3]'", 
        "    version_info = sys.version_info(major=2, minor=7, micro=3, releaseleve...", 
        "    warnoptions = []", 
        "", 
        ""
       ]
      }
     ], 
     "prompt_number": 70
    }, 
    {
     "cell_type": "code", 
     "collapsed": false, 
     "input": [
      "sys."
     ], 
     "language": "python", 
     "outputs": [
      {
       "ename": "AttributeError", 
       "evalue": "'module' object has no attribute '__main__'", 
       "output_type": "pyerr", 
       "traceback": [
        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)", 
        "\u001b[1;32m/home/stef/tasks/pywik/<ipython-input-69-94a0d0df1fa6>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0msys\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m__main__\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m__main__\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 
        "\u001b[1;31mAttributeError\u001b[0m: 'module' object has no attribute '__main__'"
       ]
      }
     ], 
     "prompt_number": 69
    }, 
    {
     "cell_type": "code", 
     "collapsed": true, 
     "input": [], 
     "language": "python", 
     "outputs": []
    }
   ]
  }
 ]
}