Python中能否将可变参数全部传递给.format()方法?
问题解答
Python的str.format()方法原生支持传递可变位置参数、可变关键字参数,你遇到KeyError: 'x'报错的核心原因是占位符语法和传参方式不匹配:
你在模板字符串里写的{x}/{y}/{z}是带命名的关键字占位符,要求.format()传入对应名称的关键字参数才能匹配;但你实际传入的是按顺序排列的位置参数,解析时找不到名为x的关键字参数,就会抛出KeyError。
可行修复方案
你可以根据自己的使用场景选下面任意一种方式修复:
- 方案1:传参时显式指定关键字名称,和占位符一一对应
这种写法不限制占位符在字符串里的顺序,可读性更好:x = "this" y = "is" z = "cake" print("{x}{y}{z}".format(z=z, y=y, x=x)) - 方案2:保留位置传参的写法,把占位符改成位置匹配格式
注意你当前的传参顺序是format(z, y, x),对应位置索引0是z、1是y、2是x,占位符要写对应索引才能匹配到你要的x、y、z顺序:
如果你调整传参顺序为x = "this" y = "is" z = "cake" print("{2}{1}{0}".format(z, y, x))format(x, y, z),直接写空占位符{}{}{}就可以按顺序自动匹配。 - 方案3:Python 3.6及以上版本可以直接用f-string语法,不需要手动传参,会自动读取当前作用域的同名变量,写法最简洁:
x = "this" y = "is" z = "cake" print(f"{x}{y}{z}")
可变参数传参说明
.format()本身完全支持可变参数传递,你可以把参数存在列表、字典里直接解包传入,只要保证占位符类型和传参类型匹配即可:
# 解包可变位置参数 pos_args = ["this", "is", "cake"] print("{0}{1}{2}".format(*pos_args)) # 解包可变关键字参数 kw_args = {"x": "this", "y": "is", "z": "cake"} print("{x}{y}{z}".format(**kw_args))
以上两种写法都能正常输出thisiscake,不会触发KeyError。
内容的提问来源于stack exchange,提问作者sindhu
相关产品推荐
相关产品推荐

