如何以正确的顺序导入零碎的项密钥?

2024-05-06 06:34:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从items.py导入到pipelines.py。 问题是导入项的顺序与它们在items.py文件中的定义方式不同。在

我的items.py文件:

class NewAdsItem(Item):
    AdId        = Field()
    DateR       = Field()
    AdURL       = Field()

在我的pipelines.py中:

^{pr2}$

输出为:

Keys in pipelines:  AdId,AdURL,DateR

而不是预期的:AdId,DateR,AdURL。在

如何确保导入的订单保持不变?

注意:这可能与How to get order of fields in Scrapy item有关,但现在还不清楚到底发生了什么,因为Python3文档声明列表和dict应该保持它们的顺序。还要注意,当使用process_item()和使用item.keys()时,顺序是保留的!但我需要按顺序访问,然后项目被刮除。在


Tags: 文件inpyfield定义顺序方式items
2条回答

我能让它工作的唯一方法是按以下方式使用this solution。在

我的items.py文件:

from scrapy.item import Item, Field
from collections import OrderedDict
from types import FunctionType

class StaticOrderHelper(type):
    # Requires Python3
    def __prepare__(name, bases, **kwargs):
        return OrderedDict()

    def __new__(mcls, name, bases, namespace, **kwargs):
        namespace['_field_order'] = [
                k
                for k, v in namespace.items()
                if not k.startswith('__') and not k.endswith('__')
                    and not isinstance(v, (FunctionType, classmethod, staticmethod))
        ]
        return type.__new__(mcls, name, bases, namespace, **kwargs)

class NewAdsItem(metaclass=StaticOrderHelper):
    AdId        = Field()
    DateR       = Field()
    AdURL       = Field()

然后将_field_order项导入到您的piplines.py中:

^{pr2}$

现在,我可以按照正确的出现顺序创建新的DB表,而不用担心Python以意外的方式对dict进行排序。在

一个简单的修复方法是在您的Item类中定义keys()方法:

class MyItem(Item):
    foo = Field()
    bar = Field()
    gar = Field()
    cha = Field()

    def keys(self):
        # in your preferred order
        return ['cha', 'gar','bar','foo']

相关问题 更多 >