From e606e238ab1476251ef377710442315017e4eb86 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sun, 3 Jun 2012 00:27:54 -0400 Subject: [PATCH] Issue 12510: Expand 2 bare excepts. Improve comments. Change deceptive name '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 | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/Lib/idlelib/CallTips.py b/Lib/idlelib/CallTips.py index aa796cb47dc..22a8a29c1f3 100644 --- a/Lib/idlelib/CallTips.py +++ b/Lib/idlelib/CallTips.py @@ -67,18 +67,18 @@ def open_calltip(self, evalfuncs): 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 @@ def fetch_tip(self, name): """ 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):