mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""
 | 
						|
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.
 | 
						|
 | 
						|
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):
 | 
						|
        # Shells like IDLE catch the SystemExit, but listen when their
 | 
						|
        # stdin wrapper is closed.
 | 
						|
        try:
 | 
						|
            sys.stdin.close()
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
        raise SystemExit(code)
 | 
						|
 | 
						|
 | 
						|
class _Printer(object):
 | 
						|
    """interactive prompt objects for printing the license text, a list of
 | 
						|
    contributors and the copyright notice."""
 | 
						|
 | 
						|
    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, "r") 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):
 | 
						|
    """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'.
 | 
						|
    """
 | 
						|
 | 
						|
    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)
 |