python-3.x - 动态更改 f 字符串变量之一
问题描述
有没有办法动态更改/替换 f-string 变量之一?假设我的格式如下:
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-string 使用我的变量而不是以初始格式定义?
# Let's say something like this? It's just a concept I know it doesn't work.
self.assertEqual('some great value1', expected % var1)
解决方案
不,f 字符串表达式的结果是不可变字符串。如同:
y = 'abc'
x = y + 'def' # result of expression is immutable string.
y = 'ghi'
print(x) # would you expect 'ghidef'? No...
如果您希望它更改,请使用format
而不是 f-strings 来重新评估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'
推荐阅读
- php - 从 foreach 循环中获取先前的迭代值
- passwords - 是否有一种编程方式来读取/打开/解密 Libreoffice ODS 文件(最好是 python / bash)
- laravel - 此路由不支持 GET 方法。支持的方法:POST / PATCH / DELETE
- swift - 如何清除具有相同 BundleIDdentifier 的应用程序
- android - 为什么即使不是公开的,我也能读、写firestore?
- firebase - 如何仅获取没有数据的文档ID?(移动的)
- java - 获取迷宫中的所有路径(仅限水平/垂直移动)
- kubernetes - Kubernetes 中没有 AWS 卷但“绑定”PVC
- javascript - 如何在javascript中的两个输入之间留一个空格?
- node.js - 如何将 sitemap.xml 文件上传到 Heroku?