Получите первое неверновое значение для ключа в нескольких отображениях/словарных словахPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Получите первое неверновое значение для ключа в нескольких отображениях/словарных словах

Сообщение Anonymous »

Я задаюсь вопросом, есть ли более чистые способы получить первое не нулевое значение для ключа в итерационных сопоставлениях/словарях, чем то, что я в настоящее время делаю. Я внедряю шаблон в полутяжелом весе, позволяя подклассам заморозить значения и/или определять по умолчанию на уровне класса, чтобы сохранить память.

Код: Выделить всё

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")
Это не сработает, поскольку мои значения разрешают быть фальшивыми (т.е. 0 для переменной int , "" для str переменная, пустая коллекция и т. Д.)

Подробнее здесь: https://stackoverflow.com/questions/797 ... ctionaries
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Запись словарных статей в правильном формате csv
    Anonymous » » в форуме Python
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Добавление словарных значений в таблицу в SQLite
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Добавление словарных значений в таблицу в SQLite
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Два словарных поиска запускаются при назначении и возврате словаря на одной строке?
    Anonymous » » в форуме C#
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Python Получите значение из ключа, если оно соответствует значению другого ключа
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»