mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 18:28:49 +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)
 | 
