当取消设置变量时,Python的字符串模板会更改括号

时间:2013-01-28 23:35:20

标签: python string templates

我有Python代码尝试使用特殊语法$ [VARIABLE](注意方括号)和string.template.safe_substitute()替换变量。这是正常工作,但有一个例外,即当引用未定义的变量时,而不是单独留下引用,因为safe_substitute()记录为使用方括号替换方括号。模板中RE的高级用法没有详细记录(http://docs.python.org/2/library/string.html#template-strings)所以我可能只是错误地使用它们。想法?

以下是测试用例的示例运行;请注意,定义var时一切正常:

% 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 :(得分: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张贴。否则,我建议尽可能使用{}作为分隔符。