string.template,数组作为占位符

时间:2014-11-15 20:19:58

标签: python string string-formatting

我有一个我试图格式化的字符串,如下所示:

output = """<div class="form-group" id="$info["id"]_container">"""

格式化调用如下所示:

Template(output).substitute(locals())

我的问题是替换是有效的,但它替换了info数组的所有值而不是我想要的id值。

这是输出:

<div class="form-group" id="{'name': 'my_name', 'type': 'my_type', 'label': 'my_label', 'help_text': 'my_help_text', 'id': 'my_id', 'placeholder': 'my_placeholder', 'class': 'my_class'}["id"]_container">

这是我想要的输出:

<div class="form-group" id="my_id_container">

我已尝试使用{$info["id"]},它只是将其视为字符串的一部分,并且没有替代品。我也试过${$info["id"]},它给出了:

ValueError: Invalid placeholder in string: line 1, col 51

我真的想在不使用%s语法的情况下完成此操作。这可能吗?

供参考,以下是所有代码:

   info = {
        "type" : "my_type",
        "name" : "my_name",
        "id" : "my_id",
        "class" : "my_class",
        "label" : "my_label",
        "placeholder" : "my_placeholder",
        "help_text" : "my_help_text"
    }

        output = """<div class="form-group" id="$info["id"]_container">"""
        output_sub = Template(output).substitute(locals()) 

3 个答案:

答案 0 :(得分:1)

我建议使用新的.format()字符串格式化语法:

output = """<div class="form-group" id="{info_id}_container">""".format(info_id=info['id'])

甚至:

info = {'id': 'my_id'}
output = """<div class="form-group" id="{id}_container">""".format(**info)

答案 1 :(得分:1)

您的代码中有一个名为info的词典,因此您将$info替换为{1}},因为info中的键locals()的值是该词典,如果您想要使用info中的值只需使用info dict:

使用:

 print(string.Template(output).substitute(**info))
<div class="form-group" id="id["id"]_container">

或者:

output = """<div class="form-group" id="$id["id"]_container">"""
print(string.Template(output).substitute(info))



In [3]: info = {'name': 'name', 'type': 'type', 'label': 'label', 'help_text': 'help_text', 'id': 'id', 'placeholder': 'placeholder', 'class': 'class'}

In [4]: locals()["info"] # what your code is accessing
Out[4]: 
{'class': 'class',
 'help_text': 'help_text',
 'id': 'id',
 'label': 'label',
 'name': 'name',
 'placeholder': 'placeholder',
 'type': 'type'}

答案 2 :(得分:1)

由于Template中的关键字无法成为表达式,因此您无法使用info["id"]之类的关键字: 如果你想使用Template,你需要一个输出:

output = """<div class="form-group" id="${info}_container">"""

但从其他方面来说,您可以使用format%s

>>> output = """<div class="form-group" id="${info}_container">"""
>>> print string.Template(output).substitute(info=info["id"])
<div class="form-group" id="id_container">