ding.utils.loader.string¶
ding.utils.loader.string
¶
enum(*items, case_sensitive=True)
¶
Overview
Create an enum loader.
Arguments:
- items (:obj:Iterable[str]): The items.
- case_sensitive (:obj:bool): Whether case sensitive.
rematch(regexp)
¶
Overview
Create a rematch loader.
Arguments:
- regexp (:obj:Union[str, re.Pattern]): The regexp.
regrep(regexp, group=0)
¶
Overview
Create a regrep loader.
Arguments:
- regexp (:obj:Union[str, re.Pattern]): The regexp.
- group (:obj:int): The group.
Full Source Code
../ding/utils/loader/string.py
1import re 2from functools import wraps 3from itertools import islice 4from typing import Callable, Union, Pattern 5 6from .base import Loader, ILoaderClass 7 8STRING_PROCESSOR = Callable[[str], str] 9 10 11def enum(*items, case_sensitive: bool = True) -> ILoaderClass: 12 """ 13 Overview: 14 Create an enum loader. 15 Arguments: 16 - items (:obj:`Iterable[str]`): The items. 17 - case_sensitive (:obj:`bool`): Whether case sensitive. 18 """ 19 20 def _case_sensitive(func: STRING_PROCESSOR) -> STRING_PROCESSOR: 21 if case_sensitive: 22 return func 23 else: 24 25 @wraps(func) 26 def _new_func(value: str) -> str: 27 return func(value).lower() 28 29 return _new_func 30 31 @_case_sensitive 32 def _item_process(value): 33 return str(value) 34 35 item_set = set([_item_process(item) for item in items]) 36 37 def _load(value: str): 38 real_value = _item_process(value) 39 if real_value not in item_set: 40 raise ValueError('unknown enum value {value}'.format(value=repr(value))) 41 42 return real_value 43 44 return Loader(_load) 45 46 47def _to_regexp(regexp) -> Pattern: 48 """ 49 Overview: 50 Convert regexp to re.Pattern. 51 Arguments: 52 - regexp (:obj:`Union[str, re.Pattern]`): The regexp. 53 """ 54 55 if isinstance(regexp, Pattern): 56 return regexp 57 elif isinstance(regexp, str): 58 return re.compile(regexp) 59 else: 60 raise TypeError( 61 'Regexp should be either str or re.Pattern but {actual} found.'.format(actual=repr(type(regexp).__name__)) 62 ) 63 64 65def rematch(regexp: Union[str, Pattern]) -> ILoaderClass: 66 """ 67 Overview: 68 Create a rematch loader. 69 Arguments: 70 - regexp (:obj:`Union[str, re.Pattern]`): The regexp. 71 """ 72 73 regexp = _to_regexp(regexp) 74 75 def _load(value: str): 76 if not regexp.fullmatch(value): 77 raise ValueError( 78 'fully match with regexp {pattern} expected but {actual} found'.format( 79 pattern=repr(regexp.pattern), 80 actual=repr(value), 81 ) 82 ) 83 84 return value 85 86 return Loader(_load) 87 88 89def regrep(regexp: Union[str, Pattern], group: int = 0) -> ILoaderClass: 90 """ 91 Overview: 92 Create a regrep loader. 93 Arguments: 94 - regexp (:obj:`Union[str, re.Pattern]`): The regexp. 95 - group (:obj:`int`): The group. 96 """ 97 98 regexp = _to_regexp(regexp) 99 100 def _load(value: str): 101 results = list(islice(regexp.finditer(value), 1)) 102 if results: 103 return results[0][group] 104 else: 105 raise ValueError( 106 'fully match with regexp {pattern} expected but {actual} found'.format( 107 pattern=repr(regexp.pattern), 108 actual=repr(value), 109 ) 110 ) 111 112 return Loader(_load)