the objects used by the site module to add custom builtins those objects are almost immortal and they keep a reference to their module globals defining them in the site module would keep too many references alive note this means this module should also avoid keep things alive in its globals shells like idle catch the systemexit but listen when their stdin wrapper is closed interactive prompt objects for printing the license text a list of contributors and the notice maxlines 23 def initself name data files dirs import os self name name self data data self lines none self filenames os path joindir filename for dir in dirs for filename in files def setupself if self lines return data none for filename in self filenames try with openfilename encoding utf8 as fp data fp read break except oserror pass if not data data self data self lines data split n self linecnt lenself lines def reprself self setup if lenself lines self maxlines return n joinself lines else return type s to see the full s text self name 2 def callself self setup prompt hit return for more or q and return to quit lineno 0 while 1 try for i in rangelineno lineno self maxlines printself linesi except indexerror break else lineno self maxlines key none while key is none key inputprompt if key not in q key none if key q break class helperobject def reprself return type help for interactive help or helpobject for help about object def callself args kwds import pydoc return pydoc helpargs kwds those objects are almost immortal and they keep a reference to their module globals defining them in the site module would keep too many references alive note this means this module should also avoid keep things alive in its globals shells like idle catch the systemexit but listen when their stdin wrapper is closed interactive prompt objects for printing the license text a list of contributors and the notice define the builtin help this is a wrapper around pydoc help that provides a helpful message when help is typed at the python interactive prompt calling help at the python prompt starts an interactive help session calling help thing prints help for the python object thing
import sys

class Quitter(object):
    def __init__(self, name, eof):
        self.name = name
        self.eof = eof
    def __repr__(self):
        return 'Use %s() or %s to exit' % (self.name, self.eof)
    def __call__(self, code=None):
        
        
        try:
            sys.stdin.close()
        except:
            pass
        raise SystemExit(code)


class _Printer(object):
    

    MAXLINES = 23

    def __init__(self, name, data, files=(), dirs=()):
        import os
        self.__name = name
        self.__data = data
        self.__lines = None
        self.__filenames = [os.path.join(dir, filename)
                            for dir in dirs
                            for filename in files]

    def __setup(self):
        if self.__lines:
            return
        data = None
        for filename in self.__filenames:
            try:
                with open(filename, encoding='utf-8') as fp:
                    data = fp.read()
                break
            except OSError:
                pass
        if not data:
            data = self.__data
        self.__lines = data.split('\n')
        self.__linecnt = len(self.__lines)

    def __repr__(self):
        self.__setup()
        if len(self.__lines) <= self.MAXLINES:
            return "\n".join(self.__lines)
        else:
            return "Type %s() to see the full %s text" % ((self.__name,)*2)

    def __call__(self):
        self.__setup()
        prompt = 'Hit Return for more, or q (and Return) to quit: '
        lineno = 0
        while 1:
            try:
                for i in range(lineno, lineno + self.MAXLINES):
                    print(self.__lines[i])
            except IndexError:
                break
            else:
                lineno += self.MAXLINES
                key = None
                while key is None:
                    key = input(prompt)
                    if key not in ('', 'q'):
                        key = None
                if key == 'q':
                    break


class _Helper(object):
    

    def __repr__(self):
        return "Type help() for interactive help, " \
               "or help(object) for help about object."
    def __call__(self, *args, **kwds):
        import pydoc
        return pydoc.help(*args, **kwds)