Brightway2修改ecoinvent活动时设置交换量遇属性错误求助
Fixing "can't set attribute" Error When Modifying Brightway Exchange Amounts
我之前也踩过这个坑!在Brightway里,直接从活动中获取的交换对象大多是不可变的视图实例,不是可直接修改的对象,所以直接赋值amount才会触发这个报错。下面是具体的解决步骤和原因分析:
正确的修改流程
1. 正确复制活动实例
你之前用msw_be = msw.copy()只是对列表做了浅拷贝,里面的活动对象还是原数据库的引用,无法直接修改。需要对单个活动对象执行深拷贝:
# 从列表中取出目标活动(假设msw列表里只有一个符合条件的活动) original_activity = msw[0] # 使用活动对象自身的copy方法创建可修改的副本 mswi_be = original_activity.copy()
2. 修改交换项的正确方式
Brightway的交换对象需要通过官方提供的modify()方法来修改属性,而不是直接赋值:
# 定位目标交换项 Carbon_dioxide_non_fossil = [exc for exc in mswi_be.biosphere() if 'Carbon dioxide, non-fossil' in exc['name']][0] # 使用modify方法更新amount属性 Carbon_dioxide_non_fossil.modify({"amount": 0.75152})
另一种可选方法是将交换项转为字典,修改后重新添加:
# 把交换项转为字典格式 exc_dict = Carbon_dioxide_non_fossil.as_dict() # 修改字典中的amount值 exc_dict['amount'] = 0.75152 # 移除原交换项,添加修改后的版本 mswi_be.remove_exchange(Carbon_dioxide_non_fossil) mswi_be.add_exchange(exc_dict)
错误原因解释
Brightway设计时,为了保护原始数据库的完整性,从数据库中直接获取的活动和交换对象都是只读的视图。只有通过copy()方法创建的活动副本,才能允许修改其交换项;而且修改交换项必须使用modify()方法,或者通过字典转换后重新添加,不能直接对属性赋值。
另外注意你代码里的小笔误:mswi_be应该是从拷贝后的活动实例中获取的,而不是原列表的引用哦~
内容的提问来源于stack exchange,提问作者papa pupu
相关产品推荐
相关产品推荐

