|
|
- import re
- import six
-
- def get_type_and_data(h_node):
- """ Helper function to return the py_type and data block for a HDF node """
- py_type = h_node.attrs["type"][0]
- if h_node.shape == ():
- data = h_node.value
- else:
- data = h_node[:]
- return py_type, data
-
-
- def sort_keys(key_list):
- """ Take a list of strings and sort it by integer value within string
-
- Args:
- key_list (list): List of keys
-
- Returns:
- key_list_sorted (list): List of keys, sorted by integer
- """
-
- # Py3 h5py returns an irritating KeysView object
- # Py3 also complains about bytes and strings, convert all keys to bytes
- if six.PY3:
- key_list2 = []
- for key in key_list:
- if isinstance(key, str):
- key = bytes(key, 'ascii')
- key_list2.append(key)
- key_list = key_list2
-
- to_int = lambda x: int(re.search(b'\d+', x).group(0))
- keys_by_int = sorted([(to_int(key), key) for key in key_list])
- return [ii[1] for ii in keys_by_int]
-
-
- def check_is_iterable(py_obj):
- """ Check whether a python object is iterable.
-
- Note: this treats unicode and string as NON ITERABLE
-
- Args:
- py_obj: python object to test
-
- Returns:
- iter_ok (bool): True if item is iterable, False is item is not
- """
- if six.PY2:
- string_types = (str, unicode)
- else:
- string_types = (str, bytes, bytearray)
- if type(py_obj) in string_types:
- return False
- try:
- iter(py_obj)
- return True
- except TypeError:
- return False
-
-
- def check_is_hashable(py_obj):
- """ Check if a python object is hashable
-
- Note: this function is currently not used, but is useful for future
- development.
-
- Args:
- py_obj: python object to test
- """
-
- try:
- py_obj.__hash__()
- return True
- except TypeError:
- return False
-
-
- def check_iterable_item_type(iter_obj):
- """ Check if all items within an iterable are the same type.
-
- Args:
- iter_obj: iterable object
-
- Returns:
- iter_type: type of item contained within the iterable. If
- the iterable has many types, a boolean False is returned instead.
-
- References:
- http://stackoverflow.com/questions/13252333/python-check-if-all-elements-of-a-list-are-the-same-type
- """
- iseq = iter(iter_obj)
-
- try:
- first_type = type(next(iseq))
- except StopIteration:
- return False
- except Exception as ex:
- return False
-
- if isinstance(iter_obj, dict):
- return first_type
- else:
- return first_type if all((type(x) is first_type) for x in iseq) else False
|