看代码,
可正常运行的代码:
years = [2021,2022,2023]
year = 2025 # 监控年份
if year in years: # 固定参数
common_params = { "filter_column": '{"A":2025}'
需求:将year引入到'{"A":2025}'替换2025,如下写,
years = [2021,2022,2023]
year = 2025 # 监控年份
if year in years: # 固定参数
common_params = { "filter_column": f'{"A":{year}}
程序运行报错。
正确代码:
years = [2021,2022,2023]
year = 2025
if str(year) in years:
common_params = { "filter_column": json.dumps({"A": year})
问题分析:
在 f-string 中:
{}有特殊含义:用于插入变量。- 所以
f'{"A":{year}}'会被 Python 解析为:- 外层:
f'...{year}...' - 内层:
"A":被当作表达式?但"A"是字符串,后面跟:会报错!
- 外层:
因为 Python 把 {"A": 当成了字典字面量的一部分,但在 f-string 表达式里不允许直接写 :。
✅ f-string 的花括号内只能是表达式,不能直接写 JSON 结构!
✅ 如果坚持用 f-string(不推荐,易错):
你需要转义花括号:
common_params = {
"filter_column": f'{{"A": "{year}"}}'
}
解释:
{``{→ 输出一个{}}→ 输出一个}- 所以
f'{``{"A": "{year}"}}'会变成字符串:{"A": "2025"}
✅ 这样能运行,但:
- 容易写错(比如漏掉引号)
- 不如
json.dumps()清晰、安全、可读
总结
| 写法 | 是否正确 | 说明 |
|---|---|---|
f'{"A":{year}}' |
❌ | 语法错误 |
f'{``{"A":{year}}}' |
⚠️ | 缺少引号,生成 {"A":2025}(数字),可能不符合后端要求 |
f'{``{"A":"{year}"}}' |
✅ | 能用,但不推荐 |
json.dumps({"A": str(year)}) |
✅✅✅ | 最佳实践 |
建议永远用 json.dumps() 来构造 JSON 字符串!