by Anonymous » 19 Aug 2025, 14:51
Ich habe ein Objekt, das seine internen Attribute in einem typedDict speichert. Ich implementiere ein Fliegengewichtsmuster, indem ich Unterklassen ermögliche, Werte einzufrieren und/oder Standardeinstellungen auf der Klassenebene zu definieren, um Speicher zu speichern.
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)
Um auf den Attributwert einer Instanz zugreifen zu können, muss ich den ersten in Status , gefrorenen oder standardmäßig gefundenen Nicht-Null-Wert zurückgeben und einen Fehler aufnehmen, wenn kein solcher Wert existiert. Aber ich frage mich, ob es sauberere Möglichkeiten gibt, den ersten Nicht-Null-Wert für einen Schlüssel in einem Iterable von Mappings/Wörterbüchern abzurufen als das, was ich gerade mache.
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
Profis: Das Abrufen des Werts (oder dessen Fehlen) kann als Ein-Liner erreicht werden. />
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")
Dies funktioniert nicht, da meine Werte für eine int Variable, " für eine Str Variable, eine leere Sammlung usw.)
Ich habe ein Objekt, das seine internen Attribute in einem typedDict speichert. Ich implementiere ein Fliegengewichtsmuster, indem ich Unterklassen ermögliche, Werte einzufrieren und/oder Standardeinstellungen auf der Klassenebene zu definieren, um Speicher zu speichern.[code]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]
Um auf den Attributwert einer Instanz zugreifen zu können, muss ich den ersten in Status , gefrorenen oder standardmäßig gefundenen Nicht-Null-Wert zurückgeben und einen Fehler aufnehmen, wenn kein solcher Wert existiert. Aber ich frage mich, ob es sauberere Möglichkeiten gibt, den ersten Nicht-Null-Wert für einen Schlüssel in einem Iterable von Mappings/Wörterbüchern abzurufen als das, was ich gerade mache.[code] @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]
Profis: Das Abrufen des Werts (oder dessen Fehlen) kann als Ein-Liner erreicht werden. /> [code] @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")
[/code]
Dies funktioniert nicht, da meine Werte für eine int Variable, " für eine Str Variable, eine leere Sammlung usw.)