Spaces:
Paused
Paused
| #+ | |
| # | |
| # This file is part of h5py, a low-level Python interface to the HDF5 library. | |
| # | |
| # Contributed by Darren Dale | |
| # | |
| # Copyright (C) 2009 Darren Dale | |
| # | |
| # http://h5py.org | |
| # License: BSD (See LICENSE.txt for full license) | |
| # | |
| #- | |
| # pylint: disable=eval-used,protected-access | |
| """ | |
| This is the h5py completer extension for ipython. It is loaded by | |
| calling the function h5py.enable_ipython_completer() from within an | |
| interactive IPython session. | |
| It will let you do things like:: | |
| f=File('foo.h5') | |
| f['<tab> | |
| # or: | |
| f['ite<tab> | |
| which will do tab completion based on the subgroups of `f`. Also:: | |
| f['item1'].at<tab> | |
| will perform tab completion for the attributes in the usual way. This should | |
| also work:: | |
| a = b = f['item1'].attrs.<tab> | |
| as should:: | |
| f['item1/item2/it<tab> | |
| """ | |
| import posixpath | |
| import re | |
| from ._hl.attrs import AttributeManager | |
| from ._hl.base import HLObject | |
| from IPython import get_ipython | |
| from IPython.core.error import TryNext | |
| from IPython.utils import generics | |
| re_attr_match = re.compile(r"(?:.*\=)?(.+\[.*\].*)\.(\w*)$") | |
| re_item_match = re.compile(r"""(?:.*\=)?(.*)\[(?P<s>['|"])(?!.*(?P=s))(.*)$""") | |
| re_object_match = re.compile(r"(?:.*\=)?(.+?)(?:\[)") | |
| def _retrieve_obj(name, context): | |
| """ Filter function for completion. """ | |
| # we don't want to call any functions, but I couldn't find a robust regex | |
| # that filtered them without unintended side effects. So keys containing | |
| # "(" will not complete. | |
| if '(' in name: | |
| raise ValueError() | |
| return eval(name, context.user_ns) | |
| def h5py_item_completer(context, command): | |
| """Compute possible item matches for dict-like objects""" | |
| base, item = re_item_match.split(command)[1:4:2] | |
| try: | |
| obj = _retrieve_obj(base, context) | |
| except Exception: | |
| return [] | |
| path, _ = posixpath.split(item) | |
| try: | |
| if path: | |
| items = (posixpath.join(path, name) for name in obj[path].keys()) | |
| else: | |
| items = obj.keys() | |
| except AttributeError: | |
| return [] | |
| items = list(items) | |
| return [i for i in items if i[:len(item)] == item] | |
| def h5py_attr_completer(context, command): | |
| """Compute possible attr matches for nested dict-like objects""" | |
| base, attr = re_attr_match.split(command)[1:3] | |
| base = base.strip() | |
| try: | |
| obj = _retrieve_obj(base, context) | |
| except Exception: | |
| return [] | |
| attrs = dir(obj) | |
| try: | |
| attrs = generics.complete_object(obj, attrs) | |
| except TryNext: | |
| pass | |
| try: | |
| # support >=ipython-0.12 | |
| omit__names = get_ipython().Completer.omit__names | |
| except AttributeError: | |
| omit__names = 0 | |
| if omit__names == 1: | |
| attrs = [a for a in attrs if not a.startswith('__')] | |
| elif omit__names == 2: | |
| attrs = [a for a in attrs if not a.startswith('_')] | |
| return ["%s.%s" % (base, a) for a in attrs if a[:len(attr)] == attr] | |
| def h5py_completer(self, event): | |
| """ Completer function to be loaded into IPython """ | |
| base = re_object_match.split(event.line)[1] | |
| try: | |
| obj = self._ofind(base).obj | |
| except AttributeError: | |
| obj = self._ofind(base).get('obj') | |
| if not isinstance(obj, (AttributeManager, HLObject)): | |
| raise TryNext | |
| try: | |
| return h5py_attr_completer(self, event.line) | |
| except ValueError: | |
| pass | |
| try: | |
| return h5py_item_completer(self, event.line) | |
| except ValueError: | |
| pass | |
| return [] | |
| def load_ipython_extension(ip=None): | |
| """ Load completer function into IPython """ | |
| if ip is None: | |
| ip = get_ipython() | |
| ip.set_hook('complete_command', h5py_completer, re_key=r"(?:.*\=)?(.+?)\[") | |