Связывание осуществляется с помощью «стратегических» функций.В этом случае кажется, что вам просто нужна пользовательская функция, которая принимает нужные вам поля.Я не проверял это, но что-то вроде следующего должно быть в порядке:
def match_by_reference_product(database):
"""Match using reference product instead of 'name' field."""
def get_product_exchange(dataset):
lst = [e for e in dataset if e['type'] == 'production']
if len(lst) != 1:
raise ValueError("Can't find one production exchange: {}".format(dataset))
return lst[0]
def get_fields(exc):
return (
exc['reference product'],
exc['unit'],
exc['location']
)
possibles = {
get_fields(get_product_exchange(dataset)): (dataset['database'], dataset['code'])
for dataset in database
}
for dataset in database:
for exc in dataset['exchanges']:
if exc['input']:
continue
if exc['type'] != 'technosphere':
continue
try:
exc['input'] = possibles[(exc['name'], exc['unit'], exc['location'])]
except KeyError:
pass
return database
Применить с помощью my_importer.apply_stragtegy(match_by_reference_product)
.