Python中str.format调用join方法报错,如何让该写法生效?
如何让str.format写法正确调用join方法?
原代码示例
a = ";" b = ["foo","bar"] c = f"{a.join(b)}" # 正常运行,输出"foo;bar" print(c) d = {"a":a, "b":b} c = "{a.join(b)}".format(**d) # 报错 print(c)
报错信息
Error: AttributeError: 'str' object has no attribute 'join(b)'
问题原因
str.format的语法解析逻辑和f-string不一样:
- f-string会直接把
{a.join(b)}当成Python表达式执行,能正确识别a.join(b)是方法调用。 - 但str.format里,
{a.join(b)}会被误认为是取变量a的join(b)属性,而Python字符串根本没有这个属性,所以抛出错误。
解决办法
方法1:用位置参数传递变量,在占位符里调用方法
直接把a和b作为位置参数传给format,通过索引调用方法:
a = ";" b = ["foo","bar"] d = {"a":a, "b":b} c = "{0.join(1)}".format(d["a"], d["b"]) print(c) # 输出:foo;bar
方法2:用关键字参数明确变量名
给format传递带明确名称的关键字参数,在占位符里调用方法:
a = ";" b = ["foo","bar"] d = {"a":a, "b":b} c = "{sep.join(items)}".format(sep=d["a"], items=d["b"]) print(c) # 输出:foo;bar
方法3:提前计算结果再传入format
先把a.join(b)的结果算出来,放进字典后再传给format:
a = ";" b = ["foo","bar"] d = {"a":a, "b":b, "joined_str": a.join(b)} c = "{joined_str}".format(**d) print(c) # 输出:foo;bar
内容的提问来源于stack exchange,提问作者xyz3lt
相关产品推荐
相关产品推荐

