def to_list(L): """ Convert an iterable object to a list. Works with nested iterables. """ if isiterable(L): return [to_list(item) for item in L] else: return L
def reorder(order, data, level): """ Reorder Sequence data according to the request. """ if not (order and isiterable(data)): return data if level == 0: return tuple(data[i] for i in order) else: return [reorder(order, value, level-1) for value in data]
def reorder(order, data, level): """ Reorder Sequence data according to the request. """ if not (order and isiterable(data)): return data if level == 0: return tuple(data[i] for i in order) else: return [reorder(order, value, level - 1) for value in data]
def get_type(values): # Direct conversion for arrays. if hasattr(values, 'dtype'): return typemap[values.dtype.char] # numpy.array elif hasattr(values, 'typecode'): return typemap[values.typecode] # array.array # Map Python type to DAP type. if not isiterable(values): values = [values] types = [typeconvert(atom) for atom in values] precedence = [String, Float64, Int32] types.sort(key=precedence.index) return types[0]
def _recursive_build(attr, values, level=0): """ Recursive function to build the DAS. """ # Check for metadata. if isinstance(values, dict): yield '%s%s {\n' % ((level+1) * INDENT, attr) for k, v in values.items(): for line in _recursive_build(k, v, level+1): yield line yield '%s}\n' % ((level+1) * INDENT) else: type_ = get_type(values).descriptor if not isiterable(values): values = [values] # Encode values values = [encode_atom(atom) for atom in values] yield '%s%s %s %s;\n' % ((level+1) * INDENT, type_, attr.replace(' ', '_'), ', '.join(values))