В основном я хочу повторить 5 раз список из двух переменных и итеративно заполнить вывод. Я, вероятно, недостаточно хорошо описываю это, поэтому я покажу, что я пытаюсь получить. У меня будет многострочный запрос в переменной query2, но я немного упростил его для вопроса здесь.
Вот код, над которым я работаю:
systems = ["prd1", "prd2", "frz1", "frz2", "dev"]
qgsystems = ["Prd1_v2", "Prd2_v2", "Frz1_v2", "Frz2_v2", "Devl_v2"]
query2 = f"""{{fn blah({x}_1_output.csv)}}select {y};"""
for x, y in zip(systems, qgsystems):
print(query2)
Результат, который я пытаюсь получить, будет таким:
{fn blah(prd1_1_output.csv)}select Prd1_v2;
{fn blah(prd2_1_output.csv)}select Prd2_v2;
{fn blah(frz1_1_output.csv)}select Frz1_v2;
{fn blah(frz2_1_output.csv)}select Frz2_v2;
{fn blah(dev_1_output.csv)}select Devl_v2;
Но вместо этого я получаю это:
{fn blah(dev_1_output.csv)}select Devl_v2;
{fn blah(dev_1_output.csv)}select Devl_v2;
{fn blah(dev_1_output.csv)}select Devl_v2;
{fn blah(dev_1_output.csv)}select Devl_v2;
{fn blah(dev_1_output.csv)}select Devl_v2;
Что я делаю не так?
Когда я начинаю новую сессию, я приближаюсь к тому, что не так. Но я все еще застрял.
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-3ea2eb0d6f53> in <module>
1 systems = ["prd1", "prd2", "frz1", "frz2", "dev"]
2 qgsystems = ["Prd1_v2", "Prd2_v2", "Frz1_v2", "Frz2_v2", "Devl_v2"]
----> 3 query2 = f"""{{fn blah({x}_1_output.csv)}}select {y};"""
4 for x, y in zip(systems, qgsystems):
5 print(query2)
NameError: name 'x' is not defined
Строки являются неизменяемыми, и переменные внутри f-строки оцениваются как однажды для создания содержимого строки во время определения f-строки, нет каждый раз, когда после этого на строку ссылаются. Если вы используете str.format()
, как предлагает MSH, функция format()
будет давать вам новую строку каждый раз, когда она вызывается.
systems = ["prd1", "prd2", "frz1", "frz2", "dev"]
qgsystems = ["Prd1_v2", "Prd2_v2", "Frz1_v2", "Frz2_v2", "Devl_v2"]
query2 = "{{fn blah({x}_1_output.csv)}}select {y};"
for x, y in zip(systems, qgsystems):
print(query2.format(x=x, y=y))
Вы не можете определить строку вне цикла, ожидая, что она будет заполнена при печати внутри. Вместо этого вам придется построить строку внутри цикла:
systems = ["prd1", "prd2", "frz1", "frz2", "dev"]
qgsystems = ["Prd1_v2", "Prd2_v2", "Frz1_v2", "Frz2_v2", "Devl_v2"]
for x, y in zip(systems, qgsystems):
print(f"{{fn blah({x}_1_output.csv)}}select {y};")
Выход:
{fn blah(prd1_1_output.csv)}select Prd1_v2;
{fn blah(prd2_1_output.csv)}select Prd2_v2;
{fn blah(frz1_1_output.csv)}select Frz1_v2;
{fn blah(frz2_1_output.csv)}select Frz2_v2;
{fn blah(dev_1_output.csv)}select Devl_v2;
Вы имеете в виду переменную
x
, гдеx
не определено. Вы можете использовать форматирование строки вместо fstring.