summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_builtin.py31
-rw-r--r--Python/bltinmodule.c182
2 files changed, 81 insertions, 132 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 7fdc063..c97a7f1 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -658,8 +658,6 @@ class BuiltinTest(unittest.TestCase):
id([0,1,2,3])
id({'spam': 1, 'eggs': 2, 'ham': 3})
- # Test input() later, together with raw_input
-
def test_int(self):
self.assertEqual(int(314), 314)
self.assertEqual(int(3.14), 3)
@@ -1108,7 +1106,7 @@ class BuiltinTest(unittest.TestCase):
self.assertRaises(TypeError, oct, ())
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')
try:
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, 0, 2*sys.maxint)
- def test_input_and_raw_input(self):
+ def test_input(self):
self.write_testfile()
fp = open(TESTFN, 'r')
savestdin = sys.stdin
@@ -1275,29 +1273,18 @@ class BuiltinTest(unittest.TestCase):
try:
sys.stdin = fp
sys.stdout = BitBucket()
- self.assertEqual(input(), 2)
- self.assertEqual(input('testing\n'), 2)
- self.assertEqual(raw_input(), 'The quick brown fox jumps over the lazy dog.')
- self.assertEqual(raw_input('testing\n'), 'Dear John')
+ self.assertEqual(input(), '1+1')
+ self.assertEqual(input('testing\n'), '1+1')
+ self.assertEqual(input(), 'The quick brown fox jumps over the lazy dog.')
+ self.assertEqual(input('testing\n'), 'Dear John')
sys.stdin = cStringIO.StringIO("NULL\0")
self.assertRaises(TypeError, input, 42, 42)
- sys.stdin = cStringIO.StringIO(" 'whitespace'")
- self.assertEqual(input(), 'whitespace')
+ whitespace = " 'whitespace'"
+ sys.stdin = cStringIO.StringIO(whitespace)
+ self.assertEqual(input(), whitespace)
sys.stdin = cStringIO.StringIO()
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
self.assertRaises(RuntimeError, input, 'prompt')
del sys.stdin
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index c9da78c..a5dc0e3 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -1073,42 +1073,89 @@ PyDoc_STRVAR(hex_doc,
Return the hexadecimal representation of an integer or long integer.");
-static PyObject *builtin_raw_input(PyObject *, PyObject *);
-
static PyObject *
builtin_input(PyObject *self, PyObject *args)
{
- PyObject *line;
- char *str;
- PyObject *res;
- PyObject *globals, *locals;
- PyCompilerFlags cf;
+ PyObject *v = NULL;
+ PyObject *fin = PySys_GetObject("stdin");
+ PyObject *fout = PySys_GetObject("stdout");
- line = builtin_raw_input(self, args);
- if (line == NULL)
- return line;
- if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
+ if (!PyArg_UnpackTuple(args, "input", 0, 1, &v))
return NULL;
- while (*str == ' ' || *str == '\t')
- str++;
- globals = PyEval_GetGlobals();
- locals = PyEval_GetLocals();
- if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
- if (PyDict_SetItemString(globals, "__builtins__",
- PyEval_GetBuiltins()) != 0)
+
+ if (fin == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "input: lost sys.stdin");
+ return NULL;
+ }
+ if (fout == NULL) {
+ PyErr_SetString(PyExc_RuntimeError, "input: lost sys.stdout");
+ return NULL;
+ }
+ if (PyFile_SoftSpace(fout, 0)) {
+ if (PyFile_WriteString(" ", fout) != 0)
return NULL;
}
- cf.cf_flags = 0;
- PyEval_MergeCompilerFlags(&cf);
- res = PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
- Py_DECREF(line);
- return res;
+ 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(input_doc,
-"input([prompt]) -> value\n\
+"input([prompt]) -> string\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 *
@@ -1687,90 +1734,6 @@ 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 *
builtin_reduce(PyObject *self, PyObject *args)
{
PyObject *seq, *func, *result = NULL, *it;
@@ -2244,7 +2207,6 @@ static PyMethodDef builtin_methods[] = {
{"ord", builtin_ord, METH_O, ord_doc},
{"pow", builtin_pow, METH_VARARGS, pow_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},
{"reload", builtin_reload, METH_O, reload_doc},
{"repr", builtin_repr, METH_O, repr_doc},