Как вставить переменную в экранированный строковый литерал? - PullRequest
0 голосов
/ 23 октября 2019

Я вызываю API, для которого в качестве параметров требуются динамические переменные. Однако я не знаю, как форматировать строку, чтобы включить переменные, когда она заключена в тройные кавычки и escape-символ обратной косой черты в начале строкового литерала.

Я пытался варьировать количество кавычек и использовать функцию ".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)

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

В строке формата { и } являются специальными. Чтобы вставить буквенную скобку, используйте {{ или }}.

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-строки могут упростить это:

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
  }
}
0 голосов
/ 23 октября 2019

Если вы используете python 3.6+, вы можете использовать f-строку:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...