Issue #16182: set_pre_input_hook() may not exist; document, and update test
diff --git a/Doc/library/readline.rst b/Doc/library/readline.rst
index e17e69c..4d3c099 100644
--- a/Doc/library/readline.rst
+++ b/Doc/library/readline.rst
@@ -104,7 +104,9 @@
 
    Append the last *nelements* items of history to a file.  The default filename is
    :file:`~/.history`.  The file must already exist.  This calls
-   :c:func:`append_history` in the underlying library.
+   :c:func:`append_history` in the underlying library.  This function
+   only exists if Python was compiled for a version of the library
+   that supports it.
 
    .. versionadded:: 3.5
 
@@ -185,7 +187,8 @@
    be used as the new hook function; if omitted or ``None``, any
    function already installed is removed.  The hook is called
    with no arguments after the first prompt has been printed and just before
-   readline starts reading input characters.
+   readline starts reading input characters.  This function only exists
+   if Python was compiled for a version of the library that supports it.
 
 
 Completion
diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py
index 51e136c..b59b6b0 100644
--- a/Lib/test/test_readline.py
+++ b/Lib/test/test_readline.py
@@ -129,24 +129,32 @@
 
         script = r"""import readline
 
-if readline.__doc__ and "libedit" in readline.__doc__:
-    readline.parse_and_bind(r'bind ^B ed-prev-char')
-    readline.parse_and_bind(r'bind "\t" rl_complete')
+is_editline = readline.__doc__ and "libedit" in readline.__doc__
+inserted = "[\xEFnserted]"
+macro = "|t\xEB[after]"
+set_pre_input_hook = getattr(readline, "set_pre_input_hook", None)
+if is_editline or not set_pre_input_hook:
     # The insert_line() call via pre_input_hook() does nothing with Editline,
     # so include the extra text that would have been inserted here
-    readline.parse_and_bind('bind -s ^A "[\xEFnserted]|t\xEB[after]"')
+    macro = inserted + macro
+
+if is_editline:
+    readline.parse_and_bind(r'bind ^B ed-prev-char')
+    readline.parse_and_bind(r'bind "\t" rl_complete')
+    readline.parse_and_bind(r'bind -s ^A "{}"'.format(macro))
 else:
     readline.parse_and_bind(r'Control-b: backward-char')
     readline.parse_and_bind(r'"\t": complete')
     readline.parse_and_bind(r'set disable-completion off')
     readline.parse_and_bind(r'set show-all-if-ambiguous off')
     readline.parse_and_bind(r'set show-all-if-unmodified off')
-    readline.parse_and_bind('Control-a: "|t\xEB[after]"')
+    readline.parse_and_bind(r'Control-a: "{}"'.format(macro))
 
 def pre_input_hook():
-    readline.insert_text("[\xEFnserted]")
+    readline.insert_text(inserted)
     readline.redisplay()
-readline.set_pre_input_hook(pre_input_hook)
+if set_pre_input_hook:
+    set_pre_input_hook(pre_input_hook)
 
 def completer(text, state):
     if text == "t\xEB":