Source code for ndmapper.io._util
# Copyright(c) 2015-2016 Association of Universities for Research in Astronomy, Inc.
# by James E.H. Turner.
# These are helper functions for the I/O routines in ndmapper.io.
from functools import wraps
from ..libutils import splitext
from .formats import formats
__all__ = ['get_backend_fn']
[docs]def get_backend_fn(funcname, filename):
"""
Given a filename string and the name of a loader function defined in
ndmapper.io, return the implementation of the latter function from the
sub-module appropriate for the file format.
Currently we use only the file extension names, rather than more foolproof
magic or try-loader-except to determine file types, avoiding unnecessary
I/O overheads & complication.
This function may be used either directly by applications wanting to cache
look-ups when doing repeated I/O operations or, internally (when defining
new generic functions in ndmapper.io), via the _get_loader decorator.
"""
fext = (splitext(filename)[1] or '').lower()
backend_fn = None
for fmt, vals in formats.iteritems():
if fext in vals:
# Import back-end module if not done already; just assume it
# exists if defined in formats dict, otherwise we have a bug.
exec('from . import _{0} as {0}'.format(fmt))
# Try to get the back-end function from the module:
try:
backend_fn = eval(fmt+'.'+funcname)
except AttributeError:
raise IOError('back end \'%s\' has no function \'%s\'' \
% (fmt, funcname))
break
if not backend_fn: # no back-end for file extension
raise IOError('unsupported file format \'%s\'' % fext)
return backend_fn
def _get_loader(fn):
"""
A decorator that calls get_backend_fn() to determine automatically the
appropriate back-end function corresponding to the generic one called
directly and provide it to the latter as an additional argument (similar
to 'self' in classes). Intended for internal use within ndmapper.io.
"""
@wraps(fn) # use func's own name & docstring instead of the wrapper's
def loader_wrapper(*args, **kwargs):
loader = get_backend_fn(fn.__name__, args[0])
return fn(loader, *args, **kwargs)
return loader_wrapper