Add columns to IPython tab completions of DataFrame attributes by takluyver · Pull Request #233 · pandas-dev/pandas (original) (raw)
boom:
In [38]: df.sort_i---------------------------------------------------------------------------
TypeError Python 2.7.2: /usr/lib/epd-7.1/bin/python
Thu Oct 20 11:07:50 2011
A problem occured executing Python code. Here is the sequence of function
calls leading up to the error, with the most recent (innermost) call last.
/home/wesm/code/repos/ipython/IPython/core/completer.pyc in complete(self=<IPython.core.completer.IPCompleter object>, text='df.sort_i', line_buffer='df.sort_i', cursor_pos=9)
810
811 # Start with a clean slate of completions
812 self.matches[:] = []
813 custom_res = self.dispatch_custom_completer(text)
814 if custom_res is not None:
815 # did custom completers produce something?
816 self.matches = custom_res
817 else:
818 # Extend the list of completions with the results of each
819 # matcher, so we return results to the user from all
820 # namespaces.
821 if self.merge_completions:
822 self.matches = []
823 for matcher in self.matchers:
824 try:
--> 825 self.matches.extend(matcher(text))
826 except:
827 # Show the ugly traceback if the matcher causes an
828 # exception, but do NOT crash the kernel!
829 sys.excepthook(*sys.exc_info())
830 else:
831 for matcher in self.matchers:
832 self.matches = matcher(text)
833 if self.matches:
834 break
835 # FIXME: we should extend our api to return a dict with completions for
836 # different types of objects. The rlcomplete() method could then
837 # simply collapse the dict into a list for readline, but we'd have
838 # richer completion semantics in other evironments.
839 self.matches = sorted(set(self.matches))
840 #io.rprint('COMP TEXT, MATCHES: %r, %r' % (text, self.matches)) # dbg
/home/wesm/code/repos/ipython/IPython/core/completer.pyc in python_matches(self=<IPython.core.completer.IPCompleter object>, text='df.sort_i')
604 if ' ' in main_text and not main_text.startswith('sudo'):
605 return []
606 text = os.path.expanduser(text)
607 aliases = self.alias_table.keys()
608 if text == '':
609 return aliases
610 else:
611 return [a for a in aliases if a.startswith(text)]
612
613 def python_matches(self,text):
614 """Match attributes or global python names"""
615
616 #io.rprint('Completer->python_matches, txt=%r' % text) # dbg
617 if "." in text:
618 try:
--> 619 matches = self.attr_matches(text)
620 if text.endswith('.') and self.omit__names:
621 if self.omit__names == 1:
622 # true if txt is _not_ a __ name, false otherwise:
623 no__name = (lambda txt:
624 re.match(r'.*\.__.*?__',txt) is None)
625 else:
626 # true if txt is _not_ a _ name, false otherwise:
627 no__name = (lambda txt:
628 re.match(r'.*\._.*?',txt) is None)
629 matches = filter(no__name, matches)
630 except NameError:
631 # catches <undefined attributes>.<tab>
632 matches = []
633 else:
634 matches = self.global_matches(text)
/home/wesm/code/repos/ipython/IPython/core/completer.pyc in attr_matches(self=<IPython.core.completer.IPCompleter object>, text='df.sort_i')
377 expr, attr = m2.group(1,2)
378 else:
379 return []
380
381 try:
382 obj = eval(expr, self.namespace)
383 except:
384 try:
385 obj = eval(expr, self.global_namespace)
386 except:
387 return []
388
389 words = dir2(obj)
390
391 try:
--> 392 words = generics.complete_object(obj, words)
393 except TryNext:
394 pass
395 # Build match list to return
396 n = len(attr)
397 res = ["%s.%s" % (expr, w) for w in words if w[:n] == attr ]
398 return res
399
400
401 class IPCompleter(Completer):
402 """Extension of the completer class with IPython-specific features"""
403
404 def _greedy_changed(self, name, old, new):
405 """update the splitter and readline delims when greedy is changed"""
406 if new:
407 self.splitter.set_delims(GREEDY_DELIMS)
/home/wesm/code/repos/ipython/IPython/external/simplegeneric/_simplegeneric.pyc in dispatch(*args=( 0 1 2 3 4
x...1
p q r 0.344 0.71 2.196 -1.939 -1.103
, ['T', '_AXIS_ALIASES', '_AXIS_NAMES', '_AXIS_NUMBERS', '__add__', '__array__', '__array_wrap__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__div__', '__doc__', '__eq__', '__floordiv__', '__format__', '__ge__', '__getattr__', '__getattribute__', ...]), **kw={})
70 for o in obs:
71 if _by_object.setdefault(id(o), (o,f))[1] is not f:
72 raise TypeError(
73 "%r already has method for object %r" % (func, o)
74 )
75 return f
76 return decorate
77
78
79 def dispatch(*args, **kw):
80 f = _gbo(id(args[0]), _sentinel)
81 if f is _sentinel:
82 for t in type(args[0]).__mro__:
83 f = _gbt(t, _sentinel)
84 if f is not _sentinel:
---> 85 return f(*args, **kw)
86 else:
87 return func(*args, **kw)
88 else:
89 return f[1](*args, **kw)
90
91 dispatch.__name__ = func.__name__
92 dispatch.__dict__ = func.__dict__.copy()
93 dispatch.__doc__ = func.__doc__
94 dispatch.__module__ = func.__module__
95
96 dispatch.when_type = when_type
97 dispatch.when_object = when_object
98 dispatch.default = func
99 dispatch.has_object = lambda o: id(o) in _by_object
100 dispatch.has_type = lambda t: t in _by_type
/home/wesm/code/pandas/pandas/core/frame.pyc in complete_dataframe(obj= 0 1 2 3 4
x...1
p q r 0.344 0.71 2.196 -1.939 -1.103
, prev_completions=['T', '_AXIS_ALIASES', '_AXIS_NAMES', '_AXIS_NUMBERS', '__add__', '__array__', '__array_wrap__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__div__', '__doc__', '__eq__', '__floordiv__', '__format__', '__ge__', '__getattr__', '__getattribute__', ...])
3204 homogenized[k] = v
3205
3206 return homogenized
3207
3208 def _put_str(s, space):
3209 return ('%s' % s)[:space].ljust(space)
3210
3211 def install_ipython_completers():
3212 """Register the DataFrame type with IPython's tab completion machinery, so
3213 that it knows about accessing column names as attributes."""
3214 from IPython.utils.generics import complete_object
3215
3216 @complete_object.when_type(DataFrame)
3217 def complete_dataframe(obj, prev_completions):
3218 return prev_completions + [c for c in obj.columns \
-> 3219 if py3compat.isidentifier(c)]
3220
3221 # Importing IPython brings in about 200 modules, so we want to avoid it unless
3222 # we're in IPython (when those modules are loaded anyway).
3223 if "IPython" in sys.modules:
3224 try:
3225 install_ipython_completers()
3226 except Exception:
3227 pass
3228
3229
3230 if __name__ == '__main__':
3231 import nose
3232 nose.runmodule(argv=[__file__, '-vvs', '-x', '--pdb', '--pdb-failure'],
3233 exit=False)
/home/wesm/code/pandas/pandas/util/py3compat.pyc in isidentifier(s=0, dotted=False)
1 import sys
2
3 PY3 = (sys.version_info[0] >= 3)
4
5 if PY3:
6 def isidentifier(s):
7 return s.isidentifier()
8
9 else:
10 # Python 2
11 import re
12 _name_re = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*$")
13 def isidentifier(s, dotted=False):
---> 14 return bool(_name_re.match(s))
TypeError: buffer size mismatch
**********************************************************************
Oops, ipython crashed. We do our best to make it stable, but...
A crash report was automatically generated with the following information:
- A verbatim copy of the crash traceback.
- A copy of your input history during this session.
- Data on your current ipython configuration.
It was left in the file named:
'/home/wesm/.ipython/Crash_report_ipython.txt'
If you can email this file to the developers, the information in it will help
them in understanding and correcting the problem.
You can mail it to: Fernando Perez at fperez.net@gmail.com
with the subject 'ipython Crash Report'.
If you want to do it now, the following command will work (under Unix):
mail -s 'ipython Crash Report' fperez.net@gmail.com < /home/wesm/.ipython/Crash_report_ipython.txt
To ensure accurate tracking of this issue, please file a report about it at:
http://github.com/ipython/ipython/issues
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/home/wesm/code/pandas/<ipython-input-38-c82c6e0d9c3c> in <module>()
----> 1 df.sort_i
/home/wesm/code/pandas/pandas/core/frame.pyc in __getattr__(self, name)
878 return self[name]
879 raise AttributeError("'%s' object has no attribute '%s'" % \
--> 880 (type(self).__name__, name))
881
882 def __setitem__(self, key, value):
AttributeError: 'DataFrame' object has no attribute 'sort_i'