def matches(self, cursor_offset, line, **kwargs): if 'locals_' not in kwargs: return None locals_ = kwargs['locals_'] r = self.locate(cursor_offset, line) if r is None: return None _, _, dexpr = lineparts.current_dict(cursor_offset, line) try: obj = safe_eval(dexpr, locals_) except EvaluationError: return None if isinstance(obj, dict) and obj.keys(): matches = set("{0!r}]".format(k) for k in obj.keys() if repr(k).startswith(r.word)) return matches if matches else None else: return None
def attr_matches(self, text, namespace): """Taken from rlcompleter.py and bent to my will. """ # Gna, Py 2.6's rlcompleter searches for __call__ inside the # instance instead of the type, so we monkeypatch to prevent # side-effects (__getattr__/__getattribute__) m = self.attr_matches_re.match(text) if not m: return [] expr, attr = m.group(1, 3) if expr.isdigit(): # Special case: float literal, using attrs here will result in # a SyntaxError return [] try: obj = safe_eval(expr, namespace) except EvaluationError: return [] with inspection.AttrCleaner(obj): matches = self.attr_lookup(obj, expr, attr) return matches