[Python-checkins] [3.10] bpo-46502: Remove "How do I tell incomplete input" from FAQ (GH-30925) (GH-30933)

pablogsal webhook-mailer at python.org
Wed Jan 26 19:16:54 EST 2022


https://github.com/python/cpython/commit/c7af838805ddf52320bce3d5978bfdd37eed1b3a
commit: c7af838805ddf52320bce3d5978bfdd37eed1b3a
branch: 3.10
author: Pablo Galindo Salgado <Pablogsal at gmail.com>
committer: pablogsal <Pablogsal at gmail.com>
date: 2022-01-27T00:16:50Z
summary:

[3.10] bpo-46502: Remove "How do I tell incomplete input" from FAQ (GH-30925) (GH-30933)

Since,

- Py_CompileString no longer allows to distinguish "incomplete input"
  from "invalid input"
- there is no alternative solution available from the Python C API
  due to how the new parser works (rewritten in 3.9)
- the only supported way is to manually import the codeop module from C
  and use its API as IDLE does, and accept its own complications

it is desirable to remove this Q&A from the official FAQ..
(cherry picked from commit f0a648152f2d8011f47cc49873438ebaf01d3f82)

Co-authored-by: Mateusz Łoskot <mateusz at loskot.net>

Co-authored-by: Mateusz Łoskot <mateusz at loskot.net>

files:
M Doc/faq/extending.rst

diff --git a/Doc/faq/extending.rst b/Doc/faq/extending.rst
index 3379e41d9de07..1d2aca6f4c8d9 100644
--- a/Doc/faq/extending.rst
+++ b/Doc/faq/extending.rst
@@ -254,7 +254,6 @@ For Red Hat, install the python-devel RPM to get the necessary files.
 
 For Debian, run ``apt-get install python-dev``.
 
-
 How do I tell "incomplete input" from "invalid input"?
 ------------------------------------------------------
 
@@ -273,130 +272,6 @@ you. You can also set the :c:func:`PyOS_ReadlineFunctionPointer` to point at you
 custom input function. See ``Modules/readline.c`` and ``Parser/myreadline.c``
 for more hints.
 
-However sometimes you have to run the embedded Python interpreter in the same
-thread as your rest application and you can't allow the
-:c:func:`PyRun_InteractiveLoop` to stop while waiting for user input.
-A solution is trying to compile the received string with
-:c:func:`Py_CompileString`. If it compiles without errors, try to execute the
-returned code object by calling :c:func:`PyEval_EvalCode`. Otherwise save the
-input for later. If the compilation fails, find out if it's an error or just
-more input is required - by extracting the message string from the exception
-tuple and comparing it to the string "unexpected EOF while parsing".  Here is a
-complete example using the GNU readline library (you may want to ignore
-**SIGINT** while calling readline())::
-
-   #include <stdio.h>
-   #include <readline.h>
-
-   #define PY_SSIZE_T_CLEAN
-   #include <Python.h>
-   #include <object.h>
-   #include <compile.h>
-   #include <eval.h>
-
-   int main (int argc, char* argv[])
-   {
-     int i, j, done = 0;                          /* lengths of line, code */
-     char ps1[] = ">>> ";
-     char ps2[] = "... ";
-     char *prompt = ps1;
-     char *msg, *line, *code = NULL;
-     PyObject *src, *glb, *loc;
-     PyObject *exc, *val, *trb, *obj, *dum;
-
-     Py_Initialize ();
-     loc = PyDict_New ();
-     glb = PyDict_New ();
-     PyDict_SetItemString (glb, "__builtins__", PyEval_GetBuiltins ());
-
-     while (!done)
-     {
-       line = readline (prompt);
-
-       if (NULL == line)                          /* Ctrl-D pressed */
-       {
-         done = 1;
-       }
-       else
-       {
-         i = strlen (line);
-
-         if (i > 0)
-           add_history (line);                    /* save non-empty lines */
-
-         if (NULL == code)                        /* nothing in code yet */
-           j = 0;
-         else
-           j = strlen (code);
-
-         code = realloc (code, i + j + 2);
-         if (NULL == code)                        /* out of memory */
-           exit (1);
-
-         if (0 == j)                              /* code was empty, so */
-           code[0] = '\0';                        /* keep strncat happy */
-
-         strncat (code, line, i);                 /* append line to code */
-         code[i + j] = '\n';                      /* append '\n' to code */
-         code[i + j + 1] = '\0';
-
-         src = Py_CompileString (code, "<stdin>", Py_single_input);
-
-         if (NULL != src)                         /* compiled just fine - */
-         {
-           if (ps1  == prompt ||                  /* ">>> " or */
-               '\n' == code[i + j - 1])           /* "... " and double '\n' */
-           {                                               /* so execute it */
-             dum = PyEval_EvalCode (src, glb, loc);
-             Py_XDECREF (dum);
-             Py_XDECREF (src);
-             free (code);
-             code = NULL;
-             if (PyErr_Occurred ())
-               PyErr_Print ();
-             prompt = ps1;
-           }
-         }                                        /* syntax error or E_EOF? */
-         else if (PyErr_ExceptionMatches (PyExc_SyntaxError))
-         {
-           PyErr_Fetch (&exc, &val, &trb);        /* clears exception! */
-
-           if (PyArg_ParseTuple (val, "sO", &msg, &obj) &&
-               !strcmp (msg, "unexpected EOF while parsing")) /* E_EOF */
-           {
-             Py_XDECREF (exc);
-             Py_XDECREF (val);
-             Py_XDECREF (trb);
-             prompt = ps2;
-           }
-           else                                   /* some other syntax error */
-           {
-             PyErr_Restore (exc, val, trb);
-             PyErr_Print ();
-             free (code);
-             code = NULL;
-             prompt = ps1;
-           }
-         }
-         else                                     /* some non-syntax error */
-         {
-           PyErr_Print ();
-           free (code);
-           code = NULL;
-           prompt = ps1;
-         }
-
-         free (line);
-       }
-     }
-
-     Py_XDECREF(glb);
-     Py_XDECREF(loc);
-     Py_Finalize();
-     exit(0);
-   }
-
-
 How do I find undefined g++ symbols __builtin_new or __pure_virtual?
 --------------------------------------------------------------------
 



More information about the Python-checkins mailing list