mirror of
https://github.com/scrapy/scrapy.git
synced 2025-02-25 09:03:57 +00:00
more efficient Item implementation and added support for using custom methods (unittests included)
This commit is contained in:
parent
dff510384b
commit
8634a0d181
@ -10,6 +10,7 @@ class _ItemMeta(type):
|
||||
for n, v in attrs.iteritems():
|
||||
if isinstance(v, BaseField):
|
||||
cls.fields[n] = v
|
||||
delattr(cls, n)
|
||||
return cls
|
||||
|
||||
|
||||
@ -38,17 +39,14 @@ class Item(ScrapedItem):
|
||||
else:
|
||||
raise AttributeError(name)
|
||||
|
||||
def __getattribute__(self, name):
|
||||
if name.startswith('_') or name == 'fields':
|
||||
return ScrapedItem.__getattribute__(self, name)
|
||||
|
||||
if name in self.fields.keys():
|
||||
def __getattr__(self, name):
|
||||
try:
|
||||
return self._values[name]
|
||||
except KeyError:
|
||||
try:
|
||||
return self._values[name]
|
||||
except KeyError:
|
||||
return self.fields[name].default
|
||||
else:
|
||||
raise AttributeError(name)
|
||||
except KeyError:
|
||||
raise AttributeError(name)
|
||||
|
||||
def __repr__(self):
|
||||
"""Generate a representation of this item that can be used to
|
||||
|
@ -85,6 +85,31 @@ class NewItemTest(unittest.TestCase):
|
||||
assert i2.name == 'John Doe'
|
||||
assert i2.number == 123
|
||||
|
||||
def test_private_attr(self):
|
||||
class TestItem(Item):
|
||||
name = fields.StringField()
|
||||
|
||||
i = TestItem()
|
||||
i._private = 'test'
|
||||
self.assertEqual(i._private, 'test')
|
||||
|
||||
def test_custom_methods(self):
|
||||
class TestItem(Item):
|
||||
name = fields.StringField()
|
||||
|
||||
def get_name(self):
|
||||
return self.name
|
||||
|
||||
def change_name(self, name):
|
||||
self.name = name
|
||||
|
||||
i = TestItem()
|
||||
self.assertEqual(i.get_name(), None)
|
||||
i.name = 'lala'
|
||||
self.assertEqual(i.get_name(), 'lala')
|
||||
i.change_name('other')
|
||||
self.assertEqual(i.get_name(), 'other')
|
||||
|
||||
|
||||
class NewItemFieldsTest(unittest.TestCase):
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user