【问题标题】:How to insert variable into escaped string literal?如何将变量插入转义字符串文字?
【发布时间】:2025-12-19 13:05:07
【问题描述】:

我正在调用一个需要动态变量作为参数的 API。但是,当字符串被三引号和反斜杠转义字符包围在字符串文字的开头时,我不知道如何格式化字符串以包含变量。

我尝试过改变引号的数量并使用“.format()”函数。

这里的代码以一种获得成功结果的方式格式化:

payload = "{\n\t\"firm\": \"myfirm\",\n\t\"id\": \"f87987562\",\n\t\"data\": {\n\t\t\"tracking_preference\": 2\n\t} \n}\n"

这是我尝试以更简洁的方式格式化字符串,同时还包括变量:

payload = \
    """{
    "firm": {0},
    "id": {1},
    "data": {
        "tracking_preference": {2}
    } 
}
""".format('myfirm', "f87987562", 2)

这是我收到的错误:

     19     } 
     20 }
---> 21 """.format('myfirm', "f87987562", 2)
     22 
     23 apikey = "secret_key"

KeyError: '\n    "firm"'

我怀疑它与反斜杠有关,但它的实现似乎是必要的。非常感谢任何有关此字符串格式背后直觉的帮助和见解。

我正在尝试将字符串文字传递给请求函数:

response = requests.request("POST", url, data=payload, headers=headers)

【问题讨论】:

标签: python string format


【解决方案1】:

在格式字符串中,{} 是特殊的。要嵌入文字括号,请使用 {{}}

payload = """{{
    "firm": "{0}",
    "id": "{1}",
    "data": {{
        "tracking_preference": {2}
    }}
}}
""".format('myfirm', "f87987562", 2)

print(payload)

输出:

{
    "firm": "myfirm",
    "id": "f87987562",
    "data": {
        "tracking_preference": 2
    }
}

在 Python 3.6+ 中,f-strings 可以使这更简单:

firm = 'myfirm'
id = 'f87987562'
tracking = 2

payload = f'''{{
    "firm": "{firm}",
    "id": "{id}",
    "data": {{
        "tracking_preference": {tracking}
    }}
}}'''

最后,json 模块非常适合这种特定场景:

import json

firm = 'myfirm'
id = 'f87987562'
tracking = 2

data = {'firm':firm,'id':id,'data':{'tracking_preference':tracking}}
payload = json.dumps(data,indent=2) # indent is optional for easy reading
print(payload)

输出:

{
  "firm": "myfirm",
  "id": "f87987562",
  "data": {
    "tracking_preference": 2
  }
}

【讨论】:

    【解决方案2】:

    如果您使用的是 python 3.6+,则可以使用 f-string:

    payload = \
        f"""{
        "firm": {"myfirm"},
        "id": {"f87987562"},
        "data": {
            "tracking_preference": {2}
        } 
    }
    """
    

    如果没有,最好使用字符串模板:

    from string import Template
    
    payload_t = Template(
        """{
        "firm": ${firm},
        "id": ${id},
        "data": {
            "tracking_preference": ${tracking}
        } 
    }
    """)
    
    payload = payload_t.substitute(firm="myfirm", id="f87987562", tracking=2)
    

    【讨论】: