Я создаю структуру данных с вложенными namedtuples (практикуя свои неизменные навыки функционального программирования), но изо всех сил пытаюсь найти простой способ заменить значения во вложенных namedtuples.Python: простой способ заменить атрибут на вложенном namedtuple?
Скажем, у меня есть структура данных, как это:
from collections import namedtuple
Root = namedtuple("Root", "inventory history")
Inventory = namedtuple("Inventory", "item1 item2")
Item = namedtuple("Item", "name num")
Event = namedtuple("Event", "action item num")
r = Root(
inventory=Inventory(
item1=Item(name="item1", num=1),
item2=Item(name="item2", num=2)
),
history=(
Event(action="buy", item="item1", num=1),
Event(action="buy", item="item2", num=2)
)
)
# Updating nested namedtuples is very clunky
num_bought = 4
r_prime = r._replace(
history = r.history + (Event(action="buy", item="item2", num=num_bought),),
inventory = r.inventory._replace(
item2 = r.inventory.item2._replace(
num = r.inventory.item2.num + num_bought
)
)
)
# Contrast with the ease of using a version of this based on mutable classes:
r.history += Event(action="buy", item="item2", num=num_bought),
r.inventory.item2.num += num_bought
Как вы можете видеть, изменяя значение для элемента в инвентаре является довольно боль, благодаря а) вынуждены индивидуально обновить все уровней, вложенных в значение, и b) не имеющих доступа к операторам, например +=
.
Это становится еще более уродливым, если элемент в моем инвентаре, который я обновляю, является динамичным, благодаря звонкам на getattr
, разбросанных повсюду.
Есть ли более простой способ справиться с этим?
Почему бы не использовать словари или классы? – jonrsharpe
'nametuple' просто не правильный контейнер данных для вас. – roippi
@jonrsharpe Я пытаюсь практиковать свои навыки функционального программирования в этом проекте, а неизменные структуры данных являются основным компонентом функционального программирования. Помимо этого, я хотел бы извлечь выгоду, если это возможно, из того факта, что неизменные структуры данных очень четко показывают, откуда возникают обновления ценности, помогая сократить количество ошибок. – spiffytech