如何初始化 Field() 以包含嵌套的 python 字典?

How can I initialize a Field() to contain a nested python dict?

我的 items.py 中有一个 Field() 名为:

scores = Field()

我想要多个抓取器将一个值附加到分数内的嵌套字典。比如我的一个爬虫:

item['scores']['baseball_score'] = '92'

另一个爬虫会:

item['scores']['basket_score'] = '21'

这样当我检索分数时:

> item['scores']
  { 'baseball_score': '92', 'basket_score': '21' }

我不想在我的抓取器中初始化字典,因为我所有的抓取器都会同时 运行ning,所以可能会出现竞争问题。无论如何,我是否可以将 item['scores'] 初始化为 items.py 中的嵌套字典?或者,我应该在 运行 我的爬虫初始化之前创建一个脚本吗?

我实际上想将我的项目中的所有字段设为嵌套列表或字典。一旦我的爬虫完成,我计划以某种方式将它们汇总到我的 pipelines.py.

这让我开始思考是否应该为我的每个爬虫设置不同的项目 Class,然后在所有爬虫完成后将它们聚合为 1 个项目。想法?

可使用defaultdict

实现
from collections import defaultdict
item = defaultdict(dict)

然后你可以将项目传递给所有的抓取工具,他们每个人都可以在适当的键上添加数据。请注意,上面仅创建了一个 2 级字典。

用 Perl 风格做这样多层次的事情的最好方法 autovivification

Python中有多种实现自动生成的方法,涉及defaultdict的递归定义或子类化dict

这里是涉及__getitem__的子类:

class AutoVivification(dict):
    """Implementation of perl's autovivification feature."""
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value

>>> item=AutoVivification()
>>> item['scores']['baseball_score'] = '92'
>>> item
{'scores': {'baseball_score': '92'}}

这是另一种方法,涉及 __missing__:

class Autoviv(dict):
    def __missing__(self, key):
        value = self[key] = type(self)()
        return value

>>> common_name = Autoviv()
>>> common_name['Mammalia']['Primates']['Homo']['H. sapiens'] = 'human being'
>>> common_name
{'Mammalia': {'Primates': {'Homo': {'H. sapiens': 'human being'}}}}

这两种方法都适用于任意深度的嵌套。