Code: Select all
from typing import ClassVar, TypedDict
class SomeBaseClass:
"""Some class that can define some behaviour."""
class State(TypedDict, total=False):
"""Defines the fields that the base class can have."""
a: int
b: str
state: State
"""Instance-level field values."""
frozen: ClassVar[State] = State()
"""Class-level frozen field values."""
defaults: ClassVar[State] = State()
"""Class-level default field values."""
def __init__(self, state: State) -> None:
"""Initialize the object with a state."""
self.state = state
if set(self.state).intersection(self.frozen):
msg = "Attempted to override frozen values."
raise ValueError(msg)
Code: Select all
@property
def a(self) -> int:
"""Return the first non-null value using `.get()`."""
if (
output := self.state.get("a", self.frozen.get("a", self.defaults.get("a")))
) is None:
msg = "`a` not found in state, frozen or defaults"
raise ValueError(msg)
return output
Code: Select all
@property
def b(self) -> str:
"""Return the first non-null value of `b` using `next`."""
if (
output := next(
(
value
for mapping in (self.state, self.frozen, self.defaults)
if (value := mapping.get("b")) is not None
),
None,
)
) is None:
msg = "`b` not found in state, frozen or defaults"
raise ValueError(msg)
return output
< /code>
Profis: Erweiterbar für mehr Zuordnungen (obwohl in meinem Anwendungsfall nicht benötigt wird) < /li>
cons: Nimmt mehr Code -Zeilen < /li> < /> < /ul>
< /li> < /> < />
Ich dachte auch daran, die Verwendung der oder < /coces> < /> < /P> zu verwenden. class = "Lang-Py PrettyPrint-Override">return self.state.get("a") or self.frozen.get("a") or self.defaults.get("a")