为什么我的字符串格式不起作用?

时间:2013-02-04 23:08:20

标签: python string format

我正在使用python创建一个jQuery函数:

jQuery = ("$('%(other_id)').click(function() { "
              "    if ($(this).is(':checked')) { "
              "        $('%(text_id)').show()     "
              "    } "
              "    else {"
              "       $('%(text_id)').hide()"
              "    }"
              " });")

我必须将变量插入other_idtext_id。我看到$符号用于字符串模板(不知道它做了什么)所以我用双重$ s($$

来逃避它们
jQuery = ("$$('%(other_id)').click(function() { "
              "    if ($$(this).is(':checked')) { "
              "        $$('%(text_id)').show()     "
              "    } "
              "    else {"
              "       $$('%(text_id)').hide()"
              "    }"
              " });")

但是我还是不能格式化:

>>> choice_id = 'foo'
>>> text_choice_id = 'bar'
>>> jQuery = ("$$('%(other_id)').click(function() { "
                  "    if ($$(this).is(':checked')) { "
                  "        $$('%(text_id)').show()     "
                  "    } "
                  "    else {"
                  "       $$('%(text_id)').hide()"
                  "    }"
                  " });")
>>> jQuery %{'other_id' : choice_id, 'text_id' : text_choice_id }

Traceback (most recent call last):
  File "<pyshell#123>", line 1, in <module>
    jQuery %{'other_id' : choice_id, 'text_id' : text_choice_id }
ValueError: unsupported format character ''' (0x27) at index 15
转出单引号后

>>> jQuery = ("$$(\'%(other_id)\').click(function() { "
                  "    if ($$(this).is(\':checked\')) { "
                  "        $$(\'%(text_id)\').show()     "
                  "    } "
                  "    else {"
                  "       $$(\'%(text_id)\').hide()"
                  "    }"
                  " });")
>>> jQuery %{'other_id' : choice_id, 'text_id' : text_choice_id }

Traceback (most recent call last):
  File "<pyshell#125>", line 1, in <module>
    jQuery %{'other_id' : choice_id, 'text_id' : text_choice_id }
ValueError: unsupported format character ''' (0x27) at index 15

无法尝试string.format(),因为我在字符串中有括号。为什么我一直将'作为一些不受支持的格式字符?

2 个答案:

答案 0 :(得分:6)

您缺少格式化程序类型:

%(other_id)s

注意括号后的s;您希望将值插入为字符串。这是一个工作版本:

jQuery = ("$('#%(other_id)s').click(function() { "
                  "    if ($(this).is(':checked')) { "
                  "        $('#%(text_id)s').show()     "
                  "    } "
                  "    else {"
                  "       $('#%(text_id)s').hide()"
                  "    }"
                  " });")

美元符号在% - 样式字符串格式中没有任何意义,我为您添加了# id选择器。 : - )

就个人而言,我会改为使用"""三重引号:

jQuery = """\
$('#%{other_id}s').click(function() {
    if ($(this).is(':checked')) {
        $('#%(text_id)s').show()
    }
    else {
        $('#%(text_id)s').hide()
    }
});
"""

更好的是,无论如何,将它放入Jinja模板中(因为你使用的是Flask)并改为渲染它:

jquery = render_template('toggle_field.js', other_id=choice_id, text_id=text_choice_id)

其中toggle_field.js是jQuery代码段的Jinja模板版本:

$('#{{ other_id }}').click(function() {
    if ($(this).is(':checked')) {
        $('#{{ text_id }}').show()
    }
    else {
        $('#{{ text_id }}').hide()
    }
});

答案 1 :(得分:0)

不考虑代码生成,而是考虑采用数据驱动的方法。静态定义以下两个函数,最好是在所有html文件中包含的某些js文件中:

function toggle_if_checked(checkbox, toggleable) {
    var cbox = $(checkbox), tgl = $(toggleable);
    tgl.toggle(cbox.is(':checked'));
}

function register_check_show_events(elist) {
    var i, cboxselector, textselector;
    function handler(e) {
        toggle_if_checked(e.target, e.data);
    }
    for (i = 0; i < elist.length; i++) {
        cboxselector = '#'+elist[0];
        textselector = '#'+elist[1];
        $(cboxselector).on('click', null, textselector, handler);
    }
}

然后注册你的事件处理程序,收集一个Python的id列表,并通过JSON将它提供给javascript。

import json

ids = [('cboxid1','textboxid1'),('cboxid2','textboxid2')]
json_ids = json.dumps(ids)
script = 'register_check_show_events({});'.format(json_ids)

通常,如果您只通过JSON在Python和JS层之间传递 data 而不是动态生成javascript代码,那么您的代码将更清晰,更易于维护。