Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
looyolo
scrapy
提交
73926002
S
scrapy
项目概览
looyolo
/
scrapy
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
scrapy
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
73926002
编写于
3月 07, 2014
作者:
E
Edwin O Marshall
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
- removing trac file again to see if merges play well together
上级
197f1418
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
0 addition
and
106 deletion
+0
-106
sep/sep-002.trac
sep/sep-002.trac
+0
-106
未找到文件。
sep/sep-002.trac
已删除
100644 → 0
浏览文件 @
197f1418
= SEP-002 - List fields API =
[[PageOutline(2-5,Contents)]]
||'''SEP:'''||3||
||'''Title:'''||List fields API||
||'''Author:'''||Pablo Hoffman||
||'''Created:'''||2009-07-21||
||'''Status'''||Obsolete by [wiki:SEP-008]||
== Introduction ==
This page presents different usage scenarios for the new multi-valued field, called !ListField.
== Proposed Implementation ==
{{{
#!python
from scrapy.item.fields import BaseField
class ListField(BaseField):
def __init__(self, field, default=None):
self._field = field
super(ListField, self).__init__(default)
def to_python(self, value):
if hasattr(value, '__iter__'): # str/unicode not allowed
return [self._field.to_python(v) for v in value]
else:
raise TypeError("Expected iterable, got %s" % type(value).__name__)
def get_default(self):
# must return a new copy to avoid unexpected behaviors with mutable defaults
return list(self._default)
}}}
== Usage Scenarios ==
=== Defining a list field ===
{{{
#!python
from scrapy.item.models import Item
from scrapy.item.fields import ListField, TextField, DateField, IntegerField
class Article(Item):
categories = ListField(TextField)
dates = ListField(DateField, default=[])
numbers = ListField(IntegerField, [])
}}}
Another case of products and variants which highlights the fact that it's important to instantiate !ListField with field instances, not classes:
{{{
#!python
from scrapy.item.models import Item
from scrapy.item.fields import ListField, TextField
class Variant(Item):
name = TextField()
class Product(Variant):
variants = ListField(ItemField(Variant))
}}}
=== Assigning a list field ===
{{{
#!python
i = Article()
i['categories'] = []
i['categories'] = ['politics', 'sport']
i['categories'] = ['test', 1] -> raises TypeError
i['categories'] = asd -> raises TypeError
i['dates'] = []
i['dates'] = ['2009-01-01'] # raises TypeError? (depends on TextField)
i['numbers'] = ['1', 2, '3']
i['numbers'] # returns [1, 2, 3]
}}}
=== Default values ===
{{{
#!python
i = Article()
i['categories'] # raises KeyError
i.get('categories') # returns None
i['numbers'] # returns []
}}}
=== Appending values ===
{{{
#!python
i = Article()
i['categories'] = ['one', 'two']
i['categories'].append(3) # XXX: should this fail?
}}}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录