全球快资讯丨Template模板类

    2023-03-27 14:19:49 来源:博客园

    Template模板类

    class Template:    """A string class for supporting $-substitutions."""    delimiter = "$"    # r"[a-z]" matches to non-ASCII letters when used with IGNORECASE, but    # without the ASCII flag.  We can"t add re.ASCII to flags because of    # backward compatibility.  So we use the ?a local flag and [a-z] pattern.    # See https://bugs.python.org/issue31672    idpattern = r"(?a:[_a-z][_a-z0-9]*)"    braceidpattern = None    flags = _re.IGNORECASE    def __init_subclass__(cls):        super().__init_subclass__()        if "pattern" in cls.__dict__:            pattern = cls.pattern        else:            delim = _re.escape(cls.delimiter)            id = cls.idpattern            bid = cls.braceidpattern or cls.idpattern            pattern = fr"""            {delim}(?:              (?P{delim})  |   # Escape sequence of two delimiters              (?P{id})       |   # delimiter and a Python identifier              {{(?P{bid})}} |   # delimiter and a braced identifier              (?P)             # Other ill-formed delimiter exprs            )            """        cls.pattern = _re.compile(pattern, cls.flags | _re.VERBOSE)    def __init__(self, template):        self.template = template    # Search for $$, $identifier, ${identifier}, and any bare $"s    def _invalid(self, mo):        i = mo.start("invalid")        lines = self.template[:i].splitlines(keepends=True)        if not lines:            colno = 1            lineno = 1        else:            colno = i - len("".join(lines[:-1]))            lineno = len(lines)        raise ValueError("Invalid placeholder in string: line %d, col %d" %                         (lineno, colno))    def substitute(self, mapping=_sentinel_dict, /, **kws):        if mapping is _sentinel_dict:            mapping = kws        elif kws:            mapping = _ChainMap(kws, mapping)        # Helper function for .sub()        def convert(mo):            # Check the most common path first.            named = mo.group("named") or mo.group("braced")            if named is not None:                return str(mapping[named])            if mo.group("escaped") is not None:                return self.delimiter            if mo.group("invalid") is not None:                self._invalid(mo)            raise ValueError("Unrecognized named group in pattern",                             self.pattern)        return self.pattern.sub(convert, self.template)    def safe_substitute(self, mapping=_sentinel_dict, /, **kws):        if mapping is _sentinel_dict:            mapping = kws        elif kws:            mapping = _ChainMap(kws, mapping)        # Helper function for .sub()        def convert(mo):            named = mo.group("named") or mo.group("braced")            if named is not None:                try:                    return str(mapping[named])                except KeyError:                    return mo.group()            if mo.group("escaped") is not None:                return self.delimiter            if mo.group("invalid") is not None:                return mo.group()            raise ValueError("Unrecognized named group in pattern",                             self.pattern)        return self.pattern.sub(convert, self.template)

    源码走读结论--->


    【资料图】

    1、定义了一种模板格式使用“$”开头,# Search for $$, $identifier, ${identifier}, and any bare $"s

    2、定义了两个重要方法:substitute 和safe_substitute,方法里区别就是safe多了一个异常处理,也就是说模板和替换数据个数不对应substitute方法会报KeyError,safe_substitute方法不会报错

    3、substitute 和safe_substitute可以使用key=value传参数,也可以使用dict方式传参数

    例1:key=value 传值

    from string import  Templatedata = Template("${name}擅长的科目${project}")new_data = data.substitute(name="张三",project="数学")print(new_data)

    结果1:

    D:\Python\python.exe D:/勿动/MS/223api/commons/wz.py张三擅长的科目数学Process finished with exit code 0

    例2:substitute

    from string import  Templatedata = Template("${name}擅长的科目${project}不擅长的科目${语文}")new_data = data.substitute(name="张三",project="数学")print(new_data)

    结果2:

    Traceback (most recent call last):  File "D:\勿动\MS\223api\commons\wz.py", line 12, in     new_data = data.substitute(name="张三",project="数学")               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File "D:\Python\Lib\string.py", line 121, in substitute    return self.pattern.sub(convert, self.template)           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File "D:\Python\Lib\string.py", line 118, in convert    self._invalid(mo)  File "D:\Python\Lib\string.py", line 101, in _invalid    raise ValueError("Invalid placeholder in string: line %d, col %d" %ValueError: Invalid placeholder in string: line 1, col 29Process finished with exit code 1

    例3:safe_

    from string import  Templatedata = Template("${name}擅长的科目${project}不擅长的科目${语文}")new_data = data.safe_substitute(name="张三",project="数学")print(new_data)

    结果3:

    张三擅长的科目数学不擅长的科目${语文}Process finished with exit code 0

    例4:字典传值

    rom string import  Templatedict1 = {"name": "张三","project":"数学"}data = Template("${name}擅长的科目${project}")new_data = data.safe_substitute(dict1)print(new_data)

    结果4:

    张三擅长的科目数学Process finished with exit code 0

    标签: