Замените каждый экземпляр переменной jinja на строку в Python - PullRequest
1 голос
/ 09 июля 2020

У меня есть следующий код для создания строки с помощью Jinja

from jinja2 import Template

jT = Template('"text": {{text}}, "peripherals": {{peripherals}}')
params = {'text': 'some_text', 'peripherals': 'mouse'}
jT.render(**params)

Результат:

'"text": some_text, "peripherals": mouse'

Есть ли способ окружить подставленные значения внутри кавычек, например:

'"text": "hello", "peripherals": "mouse"'

Помимо редактирования существующего jinja и использования {{text | tojson}}, есть ли способ / функция в Python для автоматического заключить каждое подставляемое значение в кавычки?

Ответы [ 2 ]

2 голосов
/ 09 июля 2020

Если в пакете Jinja нет встроенного инструмента для автоматической замены каждой переменной строками, то я думаю, что это будет правильный подход:

import re
from jinja2 import Template

template = '{"text": {{text}}, "peripherals": {{peripherals}}}'
# Use regular expressions to identify the variables
template = re.sub(r"({{)(\w*)(}})", r'"\1\2\3"', template)

jT = Template(template)

params = {'text': 'some_text', 'peripherals': 'mouse'}
print(jT.render(**params))

Он просто ищет переменные в шаблон и заключает их в кавычки.

1 голос
/ 09 июля 2020

Просто измените свой шаблон:

from jinja2 import Template

jT = Template('"text": "{{text}}", "peripherals": "{{peripherals}}"')
params = {'text': 'some_text', 'peripherals': 'mouse'}
print(jT.render(**params))

Возвраты:

"text": "some_text", "peripherals": "mouse"

Без изменения шаблона используйте этот пользовательский код:

jT = Template('"text": {{text}}, "peripherals": {{peripherals}}')
params = {'text': 'some_text', 'peripherals': 'mouse'}
j = jT.render(**params)
# Specifically for your example:
print(f'{j.split()[0]} "{j.split()[1][:-1]}", {j.split()[2]} "{j.split()[3]}"')
# More general:
for i in range(len(j.split()) - 1):
    if i % 2 == 0:
        print(j.split()[i] + ' ', end='')
    else:
        print('"' + j.split()[i][:-1] + '",', end=' ')
print('"' + j.split()[-1] + '"')

Возвраты:

"text": "some_text", "peripherals": "mouse"
"text": "some_text", "peripherals": "mouse"

Поместите его в функцию, если вам нужно запустить ее для нескольких шаблонов:

def render_template(j):
    for i in range(len(j.split()) - 1):
        if i % 2 == 0:
            print(j.split()[i] + ' ', end='')
        else:
            print('"' + j.split()[i][:-1] + '",', end=' ')
    print('"' + j.split()[-1] + '"')


render_template(j)

Снова возвращает:

"text": "some_text", "peripherals": "mouse"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...