]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue 12510: Expand 2 bare excepts. Improve comments. Change deceptive name
authorTerry Jan Reedy <tjreedy@udel.edu>
Sun, 3 Jun 2012 04:27:54 +0000 (00:27 -0400)
committerTerry Jan Reedy <tjreedy@udel.edu>
Sun, 3 Jun 2012 04:27:54 +0000 (00:27 -0400)
'name' to 'expression' as the latter is what the string actually represents.
The bug in this issue was only catching NameError and AttributeError when
evaluating an expression that was not necessarily a name.

Lib/idlelib/CallTips.py

index aa796cb47dcec4074ef567700bd71264af1d6896..22a8a29c1f3b44d924e67ab411e32bc481a10649 100644 (file)
@@ -67,18 +67,18 @@ class CallTips:
         if not sur_paren:
             return
         hp.set_index(sur_paren[0])
-        name = hp.get_expression()
-        if not name:
+        expression  = hp.get_expression()
+        if not expression:
             return
-        if not evalfuncs and (name.find('(') != -1):
+        if not evalfuncs and (expression.find('(') != -1):
             return
-        argspec = self.fetch_tip(name)
+        argspec = self.fetch_tip(expression)
         if not argspec:
             return
         self.active_calltip = self._calltip_window()
         self.active_calltip.showtip(argspec, sur_paren[0], sur_paren[1])
 
-    def fetch_tip(self, name):
+    def fetch_tip(self, expression):
         """Return the argument list and docstring of a function or class.
 
         If there is a Python subprocess, get the calltip there.  Otherwise,
@@ -94,25 +94,27 @@ class CallTips:
         """
         try:
             rpcclt = self.editwin.flist.pyshell.interp.rpcclt
-        except:
+        except AttributeError:
             rpcclt = None
         if rpcclt:
             return rpcclt.remotecall("exec", "get_the_calltip",
-                                     (name,), {})
+                                     (expression,), {})
         else:
-            entity = self.get_entity(name)
+            entity = self.get_entity(expression)
             return get_argspec(entity)
 
-    def get_entity(self, name):
-        "Lookup name in a namespace spanning sys.modules and __main.dict__."
-        if name:
+    def get_entity(self, expression):
+        """Return the object corresponding to expression evaluated
+        in a namespace spanning sys.modules and __main.dict__.
+        """
+        if expression:
             namespace = sys.modules.copy()
             namespace.update(__main__.__dict__)
             try:
-                return eval(name, namespace)
-                # any exception is possible if evalfuncs True in open_calltip
-                # at least Syntax, Name, Attribute, Index, and Key E. if not
-            except:
+                return eval(expression, namespace)
+            except BaseException:
+                # An uncaught exception closes idle, and eval can raise any
+                # exception, especially if user classes are involved.
                 return None
 
 def _find_constructor(class_ob):