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.
This commit is contained in:
Terry Jan Reedy 2012-06-03 00:27:54 -04:00
parent a948c79ad4
commit e606e238ab
1 changed files with 17 additions and 15 deletions

View File

@ -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):