[Python-checkins] bpo-26806: IDLE should run without docstrings (#14657)

Terry Jan Reedy webhook-mailer at python.org
Tue Jul 9 14:37:31 EDT 2019


https://github.com/python/cpython/commit/6aeb2fe606408aae14c246470794f1303b3be812
commit: 6aeb2fe606408aae14c246470794f1303b3be812
branch: master
author: Terry Jan Reedy <tjreedy at udel.edu>
committer: GitHub <noreply at github.com>
date: 2019-07-09T14:37:25-04:00
summary:

bpo-26806: IDLE should run without docstrings (#14657)

After fcf1d00, IDLE startup failed with python compiled without docstrings.

files:
M Lib/idlelib/idle_test/test_run.py
M Lib/idlelib/run.py

diff --git a/Lib/idlelib/idle_test/test_run.py b/Lib/idlelib/idle_test/test_run.py
index d0f1e9207bb1..cad0b4d98f8e 100644
--- a/Lib/idlelib/idle_test/test_run.py
+++ b/Lib/idlelib/idle_test/test_run.py
@@ -292,6 +292,14 @@ def test_default_recursion_limit_preserved(self):
         new_reclimit = sys.getrecursionlimit()
         self.assertEqual(new_reclimit, orig_reclimit)
 
+    def test_fixdoc(self):
+        def func(): "docstring"
+        run.fixdoc(func, "more")
+        self.assertEqual(func.__doc__, "docstring\n\nmore")
+        func.__doc__ = None
+        run.fixdoc(func, "more")
+        self.assertEqual(func.__doc__, "more")
+
 
 if __name__ == '__main__':
     unittest.main(verbosity=2)
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index c6ed76b23a2d..41e0ded44029 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -307,7 +307,12 @@ def fix_scaling(root):
                 font['size'] = round(-0.75*size)
 
 
+def fixdoc(fun, text):
+    tem = (fun.__doc__ + '\n\n') if fun.__doc__ is not None else ''
+    fun.__doc__ = tem + textwrap.fill(textwrap.dedent(text))
+
 RECURSIONLIMIT_DELTA = 30
+
 def install_recursionlimit_wrappers():
     """Install wrappers to always add 30 to the recursion limit."""
     # see: bpo-26806
@@ -329,19 +334,17 @@ def setrecursionlimit(*args, **kwargs):
 
         return setrecursionlimit.__wrapped__(limit + RECURSIONLIMIT_DELTA)
 
-    setrecursionlimit.__doc__ += "\n\n" + textwrap.fill(textwrap.dedent(f"""\
-        This IDLE wrapper adds {RECURSIONLIMIT_DELTA} to prevent possible
-        uninterruptible loops.
-        """).strip())
+    fixdoc(setrecursionlimit, f"""\
+            This IDLE wrapper adds {RECURSIONLIMIT_DELTA} to prevent possible
+            uninterruptible loops.""")
 
     @functools.wraps(sys.getrecursionlimit)
     def getrecursionlimit():
         return getrecursionlimit.__wrapped__() - RECURSIONLIMIT_DELTA
 
-    getrecursionlimit.__doc__ += "\n\n" + textwrap.fill(textwrap.dedent(f"""\
-        This IDLE wrapper subtracts {RECURSIONLIMIT_DELTA} to compensate for
-        the {RECURSIONLIMIT_DELTA} IDLE adds when setting the limit.
-        """).strip())
+    fixdoc(getrecursionlimit, f"""\
+            This IDLE wrapper subtracts {RECURSIONLIMIT_DELTA} to compensate
+            for the {RECURSIONLIMIT_DELTA} IDLE adds when setting the limit.""")
 
     # add the delta to the default recursion limit, to compensate
     sys.setrecursionlimit(sys.getrecursionlimit() + RECURSIONLIMIT_DELTA)



More information about the Python-checkins mailing list