无法在新创建的数据库中写入 activity 的副本

Can't write copy of activity in newly created databases

我正在尝试将现有数据库(在本例中为 ecoinvent 3.2 cut-off,但这无关紧要)的 activity 的副本写入新数据库。我有:

In:  ei = bw.Database('ecoinvent 3.2 cutoff')
     testDB = bw.Database('testdb')
     testDB.register()
     bw.databases
Out: Brightway2 databases metadata with 3 objects:
         biosphere3
         ecoinvent 3.2 cutoff
         testdb

In:  act = ei.random()
     actCopy = act.copy()
     testDB.write(actCopy)
Out: ---------------------------------------------------------------------------
     WrongDatabase                             Traceback (most recent call last)
     <ipython-input-20-831953ab6cb9> in <module>()
     ----> 1 testdb.write(act)
     [...]
     WrongDatabase: Can't write activities in databases {'a', 'd', 'u', 'c', 'r', 'n', 'f', 'l', 't', 'p'} to database testdb

报错信息中集合中的单字母字符串是什么意思?

我的代码的哪一部分导致写入新数据库失败?

调用Database('foo').write(data)需要data是一个字典,见technical documentation。在这种情况下,actCopy 是一个 activity 代理,因此最简单的解决方案是使用 actCopy.save()。或者,您可以使用以下实用函数将活动列表转换为正确的形式:

def format_me(list_of_activities, database_obj):
    return {(database_obj.name, obj['code']): obj for obj in list_of_activities}

您收到错误消息“Can't write activities in databases {'a', 'd', 'u', 'c', 'r', 'n', 'f', 'l', 't', 'p'} to database testdb”的原因是您正在传递一个列表,write 函数所做的其中一件事是确保您是 not 试图将数据写入错误的数据库。它这样做的方式是遍历字典data中的键,并将第一个元素作为数据库名称。然后它检查以确保这些名称与正在写入的数据库相同。当您像这样传递数据对象时:

{
    'alpha': 'something',
    'delta': 'something',
    'umberto': 'something',
    'california': 'something',
    ...
}

然后,当迭代你传递给 data 的对象时,它会得到这些数据库键,即 alphadelta 等。然后它取第一个元素 ( ad 等)并检查以确保数据库名称正确

这是引发此错误的 actual bw2data code

wrong_database = {key[0] for key in data}.difference({self.name})
if wrong_database:
    raise WrongDatabase("Can't write activities in databases {} to database {}".format(
                        wrong_database, self.name))