From e9e219a278eada4210304f62a2ac1925a46848c2 Mon Sep 17 00:00:00 2001 From: jadbin Date: Wed, 18 Jul 2018 19:29:28 +0800 Subject: [PATCH] add type to Field --- docs/changelog.rst | 1 + tests/test_item.py | 22 ++++++++++++++++++++++ xpaw/item.py | 20 +++++++++++++++++++- 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 4f868f2..da117a5 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -10,6 +10,7 @@ New features ~~~~~~~~~~~~ - 新增 ``request_ignored`` 事件 +- Field添加 ``type`` 参数,表示该字段的类型,在获取该字段的值时会进行类型转换 0.10.1 (2018-07-18) ------------------- diff --git a/tests/test_item.py b/tests/test_item.py index f6498c0..8dd9067 100644 --- a/tests/test_item.py +++ b/tests/test_item.py @@ -32,3 +32,25 @@ def test_item(): assert item['f2'] == 'new_v2' repr_str = repr(item) assert repr_str == "{'f1': 'v1', 'f2': 'new_v2'}" or repr_str == "{'f2': 'new_v2', 'f1': 'v1'}" + + +class FieldTypeItem(Item): + none_field = Field() + str_field = Field(type='str') + int_field = Field(type='int') + float_field = Field(type='float') + bool_field = Field(type='bool') + func_field = Field(type=int) + error_field = Field(type='error type') + + +def test_field_type(): + item = FieldTypeItem(str_field=1, int_field='1', float_field='1', bool_field='1', func_field='1', error_field='1') + assert item['none_field'] is None + assert item['str_field'] == '1' + assert isinstance(item['int_field'], int) and item['int_field'] == 1 + assert isinstance(item['float_field'], float) and item['float_field'] == 1 + assert item['bool_field'] is True + assert isinstance(item['func_field'], int) and item['func_field'] == 1 + with pytest.raises(ValueError): + print(item['error_field']) diff --git a/xpaw/item.py b/xpaw/item.py index fa0b52d..d7f3bcc 100644 --- a/xpaw/item.py +++ b/xpaw/item.py @@ -2,6 +2,8 @@ from collections import MutableMapping +from . import config + class BaseItem: """ @@ -29,7 +31,23 @@ def __init__(self, **kwargs): def __getitem__(self, key): if key not in self: return None - return self.values[key] + v = self.values[key] + t = self.fields[key].get('type') + if t: + if isinstance(t, str): + if t == 'str': + v = str(v) + elif t == 'int': + v = config.getint(v) + elif t == 'float': + v = config.getfloat(v) + elif t == 'bool': + v = config.getbool(v) + else: + raise ValueError('Unsupported item filed type: {}'.format(t)) + else: + v = t(v) + return v def __contains__(self, name): return name in self.values