Динамически изменить одну из переменных f-строки - PullRequest
0 голосов
/ 10 октября 2019

Есть ли способ динамически изменить / заменить одну из переменных f-строки? Допустим, у меня есть следующий формат:

expected = f'{var} {self.some_evaluation_1(var)} {self.some_evaluation_2(var)}'

Тогда у меня есть тестовый пример с несколькими утверждениями:

var1='some value 1'
var2='some value 2'
var3='some value 3'

var=var1
self.assertEqual('some great value1', expected)
var=var2
self.assertEqual('some great value2', expected)
var=var3
self.assertEqual('some great value3', expected)

Есть ли способ заставить f-строку использовать мою переменную вместо определенной? в исходном формате?

# Let's say something like this? It's just a concept I know it doesn't work.
self.assertEqual('some great value1', expected % var1)

1 Ответ

1 голос
/ 10 октября 2019

Нет, результатом выражения f-строки является неизменная строка. Аналогично:

y = 'abc'
x = y + 'def' # result of expression is immutable string.
y = 'ghi'
print(x)  # would you expect 'ghidef'? No...

Если вы хотите изменить его, используйте format вместо f-строк для переоценки expected:

expected = 'test{}' # NOT an f-string
var = 1
assert expected.format(var) == 'test1'
var = 2
assert expected.format(var) == 'test2'

Если вы назвали переменныекак в вашем примере, вы можете использовать:

expected = 'test{var}'
assert expected.format(var=1) == 'test1'

или передать locals() в качестве словаря аргументов, используя расширение ключевого слова (**):

expected = 'test{a}{b}'
a = 1
b = 2
assert expected.format(**locals()) == 'test12'
...