mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	raw_input() -> input(). old input behavior is history (and test_builtin passes again). It was failing due to future division.
This commit is contained in:
		
							parent
							
								
									ac3625fcb9
								
							
						
					
					
						commit
						cd65e3fc7d
					
				
					 2 changed files with 81 additions and 132 deletions
				
			
		|  | @ -658,8 +658,6 @@ def test_id(self): | ||||||
|         id([0,1,2,3]) |         id([0,1,2,3]) | ||||||
|         id({'spam': 1, 'eggs': 2, 'ham': 3}) |         id({'spam': 1, 'eggs': 2, 'ham': 3}) | ||||||
| 
 | 
 | ||||||
|     # Test input() later, together with raw_input |  | ||||||
| 
 |  | ||||||
|     def test_int(self): |     def test_int(self): | ||||||
|         self.assertEqual(int(314), 314) |         self.assertEqual(int(314), 314) | ||||||
|         self.assertEqual(int(3.14), 3) |         self.assertEqual(int(3.14), 3) | ||||||
|  | @ -1108,7 +1106,7 @@ def test_oct(self): | ||||||
|         self.assertRaises(TypeError, oct, ()) |         self.assertRaises(TypeError, oct, ()) | ||||||
| 
 | 
 | ||||||
|     def write_testfile(self): |     def write_testfile(self): | ||||||
|         # NB the first 4 lines are also used to test input and raw_input, below |         # NB the first 4 lines are also used to test input, below | ||||||
|         fp = open(TESTFN, 'w') |         fp = open(TESTFN, 'w') | ||||||
|         try: |         try: | ||||||
|             fp.write('1+1\n') |             fp.write('1+1\n') | ||||||
|  | @ -1267,7 +1265,7 @@ def __cmp__(self, other): | ||||||
|         self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint) |         self.assertRaises(OverflowError, range, -sys.maxint, sys.maxint) | ||||||
|         self.assertRaises(OverflowError, range, 0, 2*sys.maxint) |         self.assertRaises(OverflowError, range, 0, 2*sys.maxint) | ||||||
| 
 | 
 | ||||||
|     def test_input_and_raw_input(self): |     def test_input(self): | ||||||
|         self.write_testfile() |         self.write_testfile() | ||||||
|         fp = open(TESTFN, 'r') |         fp = open(TESTFN, 'r') | ||||||
|         savestdin = sys.stdin |         savestdin = sys.stdin | ||||||
|  | @ -1275,29 +1273,18 @@ def test_input_and_raw_input(self): | ||||||
|         try: |         try: | ||||||
|             sys.stdin = fp |             sys.stdin = fp | ||||||
|             sys.stdout = BitBucket() |             sys.stdout = BitBucket() | ||||||
|             self.assertEqual(input(), 2) |             self.assertEqual(input(), '1+1') | ||||||
|             self.assertEqual(input('testing\n'), 2) |             self.assertEqual(input('testing\n'), '1+1') | ||||||
|             self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.') |             self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.') | ||||||
|             self.assertEqual(raw_input('testing\n'), 'Dear John') |             self.assertEqual(input('testing\n'), 'Dear John') | ||||||
|             sys.stdin = cStringIO.StringIO("NULL\0") |             sys.stdin = cStringIO.StringIO("NULL\0") | ||||||
|             self.assertRaises(TypeError, input, 42, 42) |             self.assertRaises(TypeError, input, 42, 42) | ||||||
|             sys.stdin = cStringIO.StringIO("    'whitespace'") |             whitespace = "    'whitespace'" | ||||||
|             self.assertEqual(input(), 'whitespace') |             sys.stdin = cStringIO.StringIO(whitespace) | ||||||
|  |             self.assertEqual(input(), whitespace) | ||||||
|             sys.stdin = cStringIO.StringIO() |             sys.stdin = cStringIO.StringIO() | ||||||
|             self.assertRaises(EOFError, input) |             self.assertRaises(EOFError, input) | ||||||
| 
 | 
 | ||||||
|             # SF 876178: make sure input() respect future options. |  | ||||||
|             sys.stdin = cStringIO.StringIO('1/2') |  | ||||||
|             sys.stdout = cStringIO.StringIO() |  | ||||||
|             exec compile('print input()', 'test_builtin_tmp', 'exec') |  | ||||||
|             sys.stdin.seek(0, 0) |  | ||||||
|             exec compile('from __future__ import division;print input()', |  | ||||||
|                          'test_builtin_tmp', 'exec') |  | ||||||
|             sys.stdin.seek(0, 0) |  | ||||||
|             exec compile('print input()', 'test_builtin_tmp', 'exec') |  | ||||||
|             self.assertEqual(sys.stdout.getvalue().splitlines(), |  | ||||||
|                              ['0', '0.5', '0']) |  | ||||||
| 
 |  | ||||||
|             del sys.stdout |             del sys.stdout | ||||||
|             self.assertRaises(RuntimeError, input, 'prompt') |             self.assertRaises(RuntimeError, input, 'prompt') | ||||||
|             del sys.stdin |             del sys.stdin | ||||||
|  |  | ||||||
|  | @ -1073,42 +1073,89 @@ PyDoc_STRVAR(hex_doc, | ||||||
| Return the hexadecimal representation of an integer or long integer."); | Return the hexadecimal representation of an integer or long integer."); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static PyObject *builtin_raw_input(PyObject *, PyObject *); |  | ||||||
| 
 |  | ||||||
| static PyObject * | static PyObject * | ||||||
| builtin_input(PyObject *self, PyObject *args) | builtin_input(PyObject *self, PyObject *args) | ||||||
| { | { | ||||||
| 	PyObject *line; | 	PyObject *v = NULL; | ||||||
| 	char *str; | 	PyObject *fin = PySys_GetObject("stdin"); | ||||||
| 	PyObject *res; | 	PyObject *fout = PySys_GetObject("stdout"); | ||||||
| 	PyObject *globals, *locals; |  | ||||||
| 	PyCompilerFlags cf; |  | ||||||
| 
 | 
 | ||||||
| 	line = builtin_raw_input(self, args); | 	if (!PyArg_UnpackTuple(args, "input", 0, 1, &v)) | ||||||
| 	if (line == NULL) |  | ||||||
| 		return line; |  | ||||||
| 	if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str)) |  | ||||||
| 		return NULL; | 		return NULL; | ||||||
| 	while (*str == ' ' || *str == '\t') | 
 | ||||||
| 			str++; | 	if (fin == NULL) { | ||||||
| 	globals = PyEval_GetGlobals(); | 		PyErr_SetString(PyExc_RuntimeError, "input: lost sys.stdin"); | ||||||
| 	locals = PyEval_GetLocals(); | 		return NULL; | ||||||
| 	if (PyDict_GetItemString(globals, "__builtins__") == NULL) { | 	} | ||||||
| 		if (PyDict_SetItemString(globals, "__builtins__", | 	if (fout == NULL) { | ||||||
| 					 PyEval_GetBuiltins()) != 0) | 		PyErr_SetString(PyExc_RuntimeError, "input: lost sys.stdout"); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  | 	if (PyFile_SoftSpace(fout, 0)) { | ||||||
|  | 		if (PyFile_WriteString(" ", fout) != 0) | ||||||
| 			return NULL; | 			return NULL; | ||||||
| 	} | 	} | ||||||
| 	cf.cf_flags = 0; | 	if (PyFile_Check(fin) && PyFile_Check(fout) | ||||||
| 	PyEval_MergeCompilerFlags(&cf); |             && isatty(fileno(PyFile_AsFile(fin))) | ||||||
| 	res = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf); |             && isatty(fileno(PyFile_AsFile(fout)))) { | ||||||
| 	Py_DECREF(line); | 		PyObject *po; | ||||||
| 	return res; | 		char *prompt; | ||||||
|  | 		char *s; | ||||||
|  | 		PyObject *result; | ||||||
|  | 		if (v != NULL) { | ||||||
|  | 			po = PyObject_Str(v); | ||||||
|  | 			if (po == NULL) | ||||||
|  | 				return NULL; | ||||||
|  | 			prompt = PyString_AsString(po); | ||||||
|  | 			if (prompt == NULL) | ||||||
|  | 				return NULL; | ||||||
|  | 		} | ||||||
|  | 		else { | ||||||
|  | 			po = NULL; | ||||||
|  | 			prompt = ""; | ||||||
|  | 		} | ||||||
|  | 		s = PyOS_Readline(PyFile_AsFile(fin), PyFile_AsFile(fout), | ||||||
|  |                                   prompt); | ||||||
|  | 		Py_XDECREF(po); | ||||||
|  | 		if (s == NULL) { | ||||||
|  | 			if (!PyErr_Occurred()) | ||||||
|  | 				PyErr_SetNone(PyExc_KeyboardInterrupt); | ||||||
|  | 			return NULL; | ||||||
|  | 		} | ||||||
|  | 		if (*s == '\0') { | ||||||
|  | 			PyErr_SetNone(PyExc_EOFError); | ||||||
|  | 			result = NULL; | ||||||
|  | 		} | ||||||
|  | 		else { /* strip trailing '\n' */ | ||||||
|  | 			size_t len = strlen(s); | ||||||
|  | 			if (len > INT_MAX) { | ||||||
|  | 				PyErr_SetString(PyExc_OverflowError, | ||||||
|  | 						"[raw_]input: input too long"); | ||||||
|  | 				result = NULL; | ||||||
|  | 			} | ||||||
|  | 			else { | ||||||
|  | 				result = PyString_FromStringAndSize(s, | ||||||
|  | 								(int)(len-1)); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		PyMem_FREE(s); | ||||||
|  | 		return result; | ||||||
|  | 	} | ||||||
|  | 	if (v != NULL) { | ||||||
|  | 		if (PyFile_WriteObject(v, fout, Py_PRINT_RAW) != 0) | ||||||
|  | 			return NULL; | ||||||
|  | 	} | ||||||
|  | 	return PyFile_GetLine(fin, -1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| PyDoc_STRVAR(input_doc, | PyDoc_STRVAR(input_doc, | ||||||
| "input([prompt]) -> value\n\
 | "input([prompt]) -> string\n\
 | ||||||
| \n\ | \n\ | ||||||
| Equivalent to eval(raw_input(prompt))."); | Read a string from standard input.  The trailing newline is stripped.\n\ | ||||||
|  | If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\ | ||||||
|  | On Unix, GNU readline is used if enabled.  The prompt string, if given,\n\ | ||||||
|  | is printed without a trailing newline before reading."); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static PyObject * | static PyObject * | ||||||
|  | @ -1686,90 +1733,6 @@ For example, range(4) returns [0, 1, 2, 3].  The end point is omitted!\n\ | ||||||
| These are exactly the valid indices for a list of 4 elements."); | These are exactly the valid indices for a list of 4 elements."); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static PyObject * |  | ||||||
| builtin_raw_input(PyObject *self, PyObject *args) |  | ||||||
| { |  | ||||||
| 	PyObject *v = NULL; |  | ||||||
| 	PyObject *fin = PySys_GetObject("stdin"); |  | ||||||
| 	PyObject *fout = PySys_GetObject("stdout"); |  | ||||||
| 
 |  | ||||||
| 	if (!PyArg_UnpackTuple(args, "[raw_]input", 0, 1, &v)) |  | ||||||
| 		return NULL; |  | ||||||
| 
 |  | ||||||
| 	if (fin == NULL) { |  | ||||||
| 		PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdin"); |  | ||||||
| 		return NULL; |  | ||||||
| 	} |  | ||||||
| 	if (fout == NULL) { |  | ||||||
| 		PyErr_SetString(PyExc_RuntimeError, "[raw_]input: lost sys.stdout"); |  | ||||||
| 		return NULL; |  | ||||||
| 	} |  | ||||||
| 	if (PyFile_SoftSpace(fout, 0)) { |  | ||||||
| 		if (PyFile_WriteString(" ", fout) != 0) |  | ||||||
| 			return NULL; |  | ||||||
| 	} |  | ||||||
| 	if (PyFile_Check(fin) && PyFile_Check(fout) |  | ||||||
|             && isatty(fileno(PyFile_AsFile(fin))) |  | ||||||
|             && isatty(fileno(PyFile_AsFile(fout)))) { |  | ||||||
| 		PyObject *po; |  | ||||||
| 		char *prompt; |  | ||||||
| 		char *s; |  | ||||||
| 		PyObject *result; |  | ||||||
| 		if (v != NULL) { |  | ||||||
| 			po = PyObject_Str(v); |  | ||||||
| 			if (po == NULL) |  | ||||||
| 				return NULL; |  | ||||||
| 			prompt = PyString_AsString(po); |  | ||||||
| 			if (prompt == NULL) |  | ||||||
| 				return NULL; |  | ||||||
| 		} |  | ||||||
| 		else { |  | ||||||
| 			po = NULL; |  | ||||||
| 			prompt = ""; |  | ||||||
| 		} |  | ||||||
| 		s = PyOS_Readline(PyFile_AsFile(fin), PyFile_AsFile(fout), |  | ||||||
|                                   prompt); |  | ||||||
| 		Py_XDECREF(po); |  | ||||||
| 		if (s == NULL) { |  | ||||||
| 			if (!PyErr_Occurred()) |  | ||||||
| 				PyErr_SetNone(PyExc_KeyboardInterrupt); |  | ||||||
| 			return NULL; |  | ||||||
| 		} |  | ||||||
| 		if (*s == '\0') { |  | ||||||
| 			PyErr_SetNone(PyExc_EOFError); |  | ||||||
| 			result = NULL; |  | ||||||
| 		} |  | ||||||
| 		else { /* strip trailing '\n' */ |  | ||||||
| 			size_t len = strlen(s); |  | ||||||
| 			if (len > INT_MAX) { |  | ||||||
| 				PyErr_SetString(PyExc_OverflowError, |  | ||||||
| 						"[raw_]input: input too long"); |  | ||||||
| 				result = NULL; |  | ||||||
| 			} |  | ||||||
| 			else { |  | ||||||
| 				result = PyString_FromStringAndSize(s, |  | ||||||
| 								(int)(len-1)); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		PyMem_FREE(s); |  | ||||||
| 		return result; |  | ||||||
| 	} |  | ||||||
| 	if (v != NULL) { |  | ||||||
| 		if (PyFile_WriteObject(v, fout, Py_PRINT_RAW) != 0) |  | ||||||
| 			return NULL; |  | ||||||
| 	} |  | ||||||
| 	return PyFile_GetLine(fin, -1); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| PyDoc_STRVAR(raw_input_doc, |  | ||||||
| "raw_input([prompt]) -> string\n\
 |  | ||||||
| \n\ |  | ||||||
| Read a string from standard input.  The trailing newline is stripped.\n\ |  | ||||||
| If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\ |  | ||||||
| On Unix, GNU readline is used if enabled.  The prompt string, if given,\n\ |  | ||||||
| is printed without a trailing newline before reading."); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| static PyObject * | static PyObject * | ||||||
| builtin_reduce(PyObject *self, PyObject *args) | builtin_reduce(PyObject *self, PyObject *args) | ||||||
| { | { | ||||||
|  | @ -2244,7 +2207,6 @@ static PyMethodDef builtin_methods[] = { | ||||||
|  	{"ord",		builtin_ord,        METH_O, ord_doc}, |  	{"ord",		builtin_ord,        METH_O, ord_doc}, | ||||||
|  	{"pow",		builtin_pow,        METH_VARARGS, pow_doc}, |  	{"pow",		builtin_pow,        METH_VARARGS, pow_doc}, | ||||||
|  	{"range",	builtin_range,      METH_VARARGS, range_doc}, |  	{"range",	builtin_range,      METH_VARARGS, range_doc}, | ||||||
|  	{"raw_input",	builtin_raw_input,  METH_VARARGS, raw_input_doc}, |  | ||||||
|  	{"reduce",	builtin_reduce,     METH_VARARGS, reduce_doc}, |  	{"reduce",	builtin_reduce,     METH_VARARGS, reduce_doc}, | ||||||
|  	{"reload",	builtin_reload,     METH_O, reload_doc}, |  	{"reload",	builtin_reload,     METH_O, reload_doc}, | ||||||
|  	{"repr",	builtin_repr,       METH_O, repr_doc}, |  	{"repr",	builtin_repr,       METH_O, repr_doc}, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Neal Norwitz
						Neal Norwitz