Holen Sie sich den ersten Nicht-Null-Wert für einen Schlüssel in mehreren Zuordnungen/WörterbüchernPython

Python-Programme
Anonymous
 Holen Sie sich den ersten Nicht-Null-Wert für einen Schlüssel in mehreren Zuordnungen/Wörterbüchern

Post by Anonymous »

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.)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post