Source code for qcodes.parameters._paramspec

from __future__ import annotations

from typing import ClassVar

from typing_extensions import TypedDict


[docs] class ParamSpecBaseDict(TypedDict): name: str paramtype: str label: str | None unit: str | None
[docs] class ParamSpecBase: allowed_types: ClassVar[list[str]] = ["array", "numeric", "text", "complex"] def __init__( self, name: str, paramtype: str, label: str | None = None, unit: str | None = None, ): """ Args: name: name of the parameter paramtype: type of the parameter, i.e. the SQL storage class label: label of the parameter unit: The unit of the parameter """ if not isinstance(paramtype, str): raise ValueError("Paramtype must be a string.") if paramtype.lower() not in self.allowed_types: raise ValueError(f"Illegal paramtype. Must be on of {self.allowed_types}") if not name.isidentifier(): raise ValueError( f"Invalid name: {name}. Only valid python " "identifier names are allowed (no spaces or " "punctuation marks, no prepended " "numbers, etc.)" ) self.name = name self.type = paramtype.lower() self.label = label or "" self.unit = unit or "" self._hash: int = self._compute_hash() def _compute_hash(self) -> int: """ This method should only be called by __init__ """ attrs = ["name", "type", "label", "unit"] # First, get the hash of the tuple with all the relevant attributes all_attr_tuple_hash = hash(tuple(getattr(self, attr) for attr in attrs)) hash_value = all_attr_tuple_hash # Then, XOR it with the individual hashes of all relevant attributes for attr in attrs: hash_value = hash_value ^ hash(getattr(self, attr)) return hash_value
[docs] def sql_repr(self) -> str: return f"{self.name} {self.type}"
def __repr__(self) -> str: return ( f"ParamSpecBase('{self.name}', '{self.type}', '{self.label}', " f"'{self.unit}')" ) def __eq__(self, other: object) -> bool: if not isinstance(other, ParamSpecBase): return False attrs = ["name", "type", "label", "unit"] for attr in attrs: if getattr(self, attr) != getattr(other, attr): return False return True
[docs] def __hash__(self) -> int: """ Allow ParamSpecBases in data structures that use hashing (e.g. sets) """ return self._hash
def _to_dict(self) -> ParamSpecBaseDict: """ Write the ParamSpec as a dictionary """ output = ParamSpecBaseDict( name=self.name, paramtype=self.type, label=self.label, unit=self.unit ) return output @classmethod def _from_dict(cls, ser: ParamSpecBaseDict) -> ParamSpecBase: """ Create a ParamSpec instance of the current version from a dictionary representation of ParamSpec of some version The version changes must be implemented as a series of transformations of the representation dict. """ return ParamSpecBase( name=ser["name"], paramtype=ser["paramtype"], label=ser["label"], unit=ser["unit"], )