scrapy 什么样的元数据实际上可以进入一个零碎的.Field对象?

sqougxex  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(134)

我今天在Scrapy中查看项目的文档,并遇到了以下行:
字段对象用于为每个字段指定元数据...您可以为每个字段指定任何类型的元数据。对字段对象接受的值没有限制。
然而,在文档中,传递给Field对象的唯一“元数据”似乎是函数(在本例中是序列化程序)或输入/输出处理器。
因此我进入Python并尝试创建以下Item:

class ScrapyPracticeItem(scrapy.Item):
     name = scrapy.Field()
     age = scrapy.Field('color':'purple')

但这也不是公认的语法。
我现在很困惑--有没有人能给予我一个更好的定义,他们所说的元数据是什么意思?他们只是指项目中数据的转换吗?它能包含更多的信息吗?

lg40wkob

lg40wkob1#

field对象只是标准python字典的一个别名。
字段([arg])¶
Field类只是内置dict类的一个别名,并不提供任何额外的功能或属性。换句话说,Field对象是普通的Python dict。一个单独的类用于支持基于类属性的项声明语法。
因此,任何可以用作字典值的内容都可以赋给scrapy字段,而无需在其构造函数中使用任何参数。

class MyItem(scrapy.Item):
    color = scrapy.Field()
    age = scrapy.Field()

当他们说您可以设置元数据时,字段就是您正在设置的项的元数据。添加序列化程序的选项实际上并不是由Field直接处理的,而是由Item对象或其MetaClass处理的。
这是scrapy.field类的实际源代码:

class Field(dict):
    """Container of field metadata"""

# that is it

所有的数据处理和名称分配都由scrapy的一个自定义元类负责。
Scrapy的结构是有意的,它从django框架中借用了很多方法。Item类及其关联的元类被设计成类似于djangoModel类,它用来与存储后端(通常是数据库)进行通信。
然而,因为零碎的项目可以以无数种方式提取和使用,Item类比它的对应物django允许更大的灵活性,所以对于什么可以被认为是元数据或者什么可以存储在Item类中,实际上没有限制。

相关问题