Source code for msl.io.metadata
"""
Provides information about other data.
"""
try:
# this try..except block fixes:
# DeprecationWarning: Using or importing the ABCs from 'collections' instead
# of from 'collections.abc' is deprecated, and in 3.8 it will stop working
from collections.abc import MutableMapping
except ImportError:
from collections import MutableMapping
import numpy as np
from .dictionary import Dictionary
[docs]class Metadata(Dictionary):
def __init__(self, read_only, vertex_name, **kwargs):
"""Provides information about other data.
Do not instantiate directly. A :class:`Metadata` object is created automatically
when :meth:`~msl.io.group.Group.create_dataset` or :meth:`~msl.io.group.Group.create_group`
is called.
Parameters
----------
read_only : :class:`bool`
Whether :class:`Metadata` is to be accessed in read-only mode.
vertex_name : :class:`str`
The name of the :class:`~msl.io.vertex.Vertex` that :class:`Metadata` is associated with.
**kwargs
Key-value pairs that will be used to create the :class:`.Dictionary`.
"""
super(Metadata, self).__init__(read_only, **kwargs)
self._vertex_name = vertex_name
def __repr__(self):
return '<Metadata {!r} {}>'.format(self._vertex_name, super(Metadata, self).__repr__())
def __getitem__(self, item):
try:
value = self._mapping[item]
except KeyError:
pass # raise a more detailed error message below
else:
if isinstance(value, MutableMapping):
return Metadata(self._read_only, self._vertex_name, **value)
return value
self._raise_key_error(item)
def __delattr__(self, item):
self._raise_if_read_only()
try:
del self._mapping[item]
return
except KeyError as e:
msg = str(e)
raise AttributeError(msg)
def __getattr__(self, item):
try:
return self.__getitem__(item)
except KeyError as e:
msg = str(e)
raise AttributeError(msg)
def __setattr__(self, item, value):
if item.endswith('read_only'):
val = bool(value)
self.__dict__['_read_only'] = val
try:
# make all numpy ndarray's read only also
for obj in self.__dict__['_mapping'].values():
if isinstance(obj, np.ndarray):
obj.setflags(write=not val)
except KeyError:
pass
elif item == '_mapping' or item == '_vertex_name':
self.__dict__[item] = value
else:
self._raise_if_read_only()
self._mapping[item] = value
[docs] def copy(self, read_only=None):
"""Create a copy of the :class:`Metadata`.
Parameters
----------
read_only : :class:`bool`, optional
Whether the copy should be created in read-only mode. If :data:`None` then
creates a copy using the mode for the :class:`Metadata` that is being copied.
Returns
-------
:class:`Metadata`
A copy of the :class:`Metadata`.
"""
return Metadata(self._mode(read_only), self._vertex_name, **self._mapping)
[docs] def fromkeys(self, seq, value=None, read_only=None):
"""Create a new :class:`Metadata` object with keys from `seq` and values set to `value`.
Parameters
----------
seq
Any iterable object that contains the names of the keys.
value : :class:`object`, optional
The default value to use for each key.
read_only : :class:`bool`, optional
Whether the returned object should be created in read-only mode. If
:data:`None` then uses the mode for the :class:`Metadata` that is used
to call this method.
Returns
-------
:class:`Metadata`
A new :class:`Metadata` object.
"""
return Metadata(self._mode(read_only), self._vertex_name, **dict((key, value) for key in seq))
def _mode(self, read_only):
return self._read_only if read_only is None else read_only