mirror of
https://github.com/python/cpython.git
synced 2025-08-30 05:35:08 +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 @@ class BuiltinTest(unittest.TestCase):
|
||||||
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 @@ class BuiltinTest(unittest.TestCase):
|
||||||
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 @@ class BuiltinTest(unittest.TestCase):
|
||||||
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 @@ class BuiltinTest(unittest.TestCase):
|
||||||
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