Source code for qcodes.metadatable.metadatable_base

from abc import abstractmethod
from typing import Any, Dict, Mapping, Optional, Sequence, final

from qcodes.utils import deep_update

# NB: At the moment, the Snapshot type is a bit weak, as the Any
#     for the value type doesn't tell us anything about the schema
#     followed by snapshots.
#     This is needed, however, since snapshots are Dict instances with
#     homogeneous keys and heterogeneous values, something that
#     recent Python versions largely replace with features like
#     typing.NamedTuple and @dataclass.
#     As those become more widely available, the weakness of this
#     type constraint will become less of an issue.
Snapshot = Dict[str, Any]

[docs]class Metadatable: def __init__(self, metadata: Optional[Mapping[str, Any]] = None): self.metadata: Dict[str, Any] = {} self.load_metadata(metadata or {})
[docs] def load_metadata(self, metadata: Mapping[str, Any]) -> None: """ Load metadata into this classes metadata dictionary. Args: metadata: Metadata to load. """ deep_update(self.metadata, metadata)
[docs] @final def snapshot(self, update: Optional[bool] = False) -> Snapshot: """ Decorate a snapshot dictionary with metadata. DO NOT override this method if you want metadata in the snapshot instead, override :meth:`snapshot_base`. Args: update: Passed to snapshot_base. Returns: Base snapshot. """ snap = self.snapshot_base(update=update) if len(self.metadata): snap["metadata"] = self.metadata return snap
[docs] def snapshot_base( self, update: Optional[bool] = False, params_to_skip_update: Optional[Sequence[str]] = None, ) -> Snapshot: """ Override this with the primary information for a subclass. """ return {}
[docs]class MetadatableWithName(Metadatable): """Add short_name and full_name properties to Metadatable. This is used as a base class for all components in QCoDeS that are members of a station to ensure that they have a name and consistent interface.""" @property @abstractmethod def short_name(self) -> str: """ Name excluding name of any parent that this object is bound to. """ @property @abstractmethod def full_name(self) -> str: """ Name including name of any parent that this object is bound to separated by '_'. """