mirror of https://github.com/scrapy/scrapy.git
New implementation of Field and MultiValuedField
This commit is contained in:
parent
0cc289ac84
commit
d5f0cae776
|
|
@ -11,16 +11,13 @@ class FieldValueError(Exception):
|
|||
pass
|
||||
|
||||
|
||||
class Field(object):
|
||||
class BaseField(object):
|
||||
def __init__(self, required=False, default=None):
|
||||
self.required = required
|
||||
self.default = default or self.to_python(None)
|
||||
|
||||
def assign(self, value):
|
||||
if hasattr(value, '__iter__'):
|
||||
return self.to_python(self.deiter(value))
|
||||
else:
|
||||
return self.to_python(value)
|
||||
return self.to_python(value)
|
||||
|
||||
def to_python(self, value):
|
||||
"""
|
||||
|
|
@ -29,12 +26,20 @@ class Field(object):
|
|||
"""
|
||||
return value
|
||||
|
||||
|
||||
class Field(BaseField):
|
||||
def assign(self, value):
|
||||
if hasattr(value, '__iter__'):
|
||||
return self.to_python(self.deiter(value))
|
||||
else:
|
||||
return self.to_python(value)
|
||||
|
||||
def deiter(self, value):
|
||||
"Converts the input iterable into a single value."
|
||||
return ' '.join(value)
|
||||
|
||||
|
||||
class MultiValuedField(Field):
|
||||
class MultiValuedField(BaseField):
|
||||
def __init__(self, field_type, required=False, default=None):
|
||||
self._field = field_type()
|
||||
super(MultiValuedField, self).__init__(required, default)
|
||||
|
|
@ -45,9 +50,6 @@ class MultiValuedField(Field):
|
|||
else:
|
||||
return [self._field.to_python(v) for v in value]
|
||||
|
||||
def deiter(self, value):
|
||||
return value
|
||||
|
||||
|
||||
class BooleanField(Field):
|
||||
def to_python(self, value):
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
from scrapy.item import ScrapedItem
|
||||
from scrapy.contrib_exp.newitem.fields import Field
|
||||
from scrapy.contrib_exp.newitem.fields import BaseField
|
||||
|
||||
|
||||
class ItemMeta(type):
|
||||
|
|
@ -8,7 +8,7 @@ class ItemMeta(type):
|
|||
cls = type.__new__(meta, class_name, bases, attrs)
|
||||
cls.fields = cls.fields.copy()
|
||||
for n, v in attrs.items():
|
||||
if isinstance(v, Field):
|
||||
if isinstance(v, BaseField):
|
||||
cls.fields[n] = v
|
||||
|
||||
return cls
|
||||
|
|
|
|||
Loading…
Reference in New Issue