Python字符串模板在变量未设置时更改括号

1 投票
1 回答
1132 浏览
提问于 2025-04-17 13:59

我有一段Python代码,试图用一种特殊的语法 $[VARIABLE](注意是方括号)和 string.template.safe_substitute() 来替换变量。这一切都运行得很好,唯一的问题是,当引用一个未定义的变量时,按照 safe_substitute() 的说明,它应该是保持这个引用不变的,但实际上却把方括号替换成了大括号。关于在模板中高级使用正则表达式的部分没有详细的文档说明(http://docs.python.org/2/library/string.html#template-strings),所以我可能是用错了。有没有什么想法?

这是测试案例的一个运行示例;注意当变量被定义时,一切都正常:

% python tmpl.py
===$[UNDEFINED]===
===${UNDEFINED}===

% UNDEFINED=Hello python tmpl.py
===$[UNDEFINED]===
===Hello===

这是测试案例本身:

import os
from string import Template


# The strategy here is to replace $[FOO] but leave traditional
# shell-type expansions $FOO and ${FOO} alone.
# The '(?!)' below is a guaranteed-not-to-match RE.
class _Replace(Template):
    pattern = r"""
        \$(?:
        (?P<escaped>(?!))               | # no escape char
        (?P<named>(?!))                 | # do not match $FOO, ${FOO}
        \[(?P<braced>[A-Z_][A-Z_\d]+)\] | # do match $[FOO]
        (?P<invalid>)
    )
    """


if '__main__' == __name__:
    text = '===$[UNDEFINED]==='
    tmpl = _Replace(text)
    result = tmpl.safe_substitute(os.environ)
    print text
    print result

1 个回答

0

Template 这个东西假设大括号字符实际上就是一个大括号:

string.py:194:

        if braced is not None:
            try:
                return '%s' % (mapping[braced],)
            except KeyError:
                return self.delimiter + '{' + braced + '}'

如果你觉得这是个错误,可以去 http://bugs.python.org 提交一下。否则,我建议如果可以的话,就直接用 {} 作为你的分隔符。

撰写回答