Код: Выделить всё
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)
Текущая реализация (S)
Чтобы получить доступ к значению атрибута экземпляра, мне нужно вернуть первое не нулевое значение, найденное в состоянии , замороженное или по умолчанию и вынести ошибку, если такая стоимость не существует. B ). Но у меня есть ощущение, что для достижения такого поведения может быть более чистый/более гладкий способ.Код: Выделить всё
@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>
Pros: Получение значения (или его отсутствия) может быть достигнуто как одностроение. PrettyPrint-Override "> @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>
Pros: расширяется до большего количества отображений (хотя и не требуется в моем варианте использования) < /li>
Минусы: требует больше строк кода < /li>
< /ul>
Примечания < /h4>
Я думал об использовании или < /code> syntax: < /h4>
. class = "lang-py prettyprint-override">return self.state.get("a") or self.frozen.get("a") or self.defaults.get("a")
Подробнее здесь: https://stackoverflow.com/questions/797 ... ctionaries