diff options
Diffstat (limited to 'Lib/idlelib')
| -rw-r--r-- | Lib/idlelib/CallTips.py | 32 | 
1 files changed, 17 insertions, 15 deletions
| diff --git a/Lib/idlelib/CallTips.py b/Lib/idlelib/CallTips.py index aa796cb..22a8a29 100644 --- a/Lib/idlelib/CallTips.py +++ b/Lib/idlelib/CallTips.py @@ -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): | 
