我正在创建一个带有嵌套命名元组的数据结构(练习我不可变的函数式编程技能),但我正在努力寻找一种简单的方法来替换嵌套命名元组中的值。
假设我有一个这样的数据结构:
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
正如您所看到的,更改库存中项目的值是一件非常痛苦的事情,这要归功于 a) 被迫单独更新该值嵌套在其下的所有层,以及 b) 无法访问诸如+=
.
如果我正在更新的库存中的项目是动态的,这会变得更加丑陋,这要归功于getattr
到处都是呼吁。
有没有更简单的方法来处理这个?