Python 为什么我必须在str.format(*args,**kwargs)的列表前面使用*
读完这些:Python 为什么我必须在str.format(*args,**kwargs)的列表前面使用*,python,string,format,variadic-functions,Python,String,Format,Variadic Functions,读完这些: 我想确保我理解得很好:str.format(*args,**kwargs) 如果uniques是两个整数的列表,例如[0,0],我会在循环中使用它,条件是增加第一个元素,没有条件增加第二个元素,使用: print('Task finished. {0!s} retrieved out of {1!s} tested'.format(*uniques)) 我必须使用*uniques,因为uniques将作为元组传递给format。但是如果我用 print('Task fi
我想确保我理解得很好:
str.format(*args,**kwargs)
如果uniques
是两个整数的列表,例如[0,0]
,我会在循环中使用它,条件是增加第一个元素,没有条件增加第二个元素,使用:
print('Task finished. {0!s} retrieved out of {1!s} tested'.format(*uniques))
我必须使用*uniques
,因为uniques
将作为元组传递给format。但是如果我用
print('Task finished. {0.[0]} retrieved out of {0.[1]} tested'.format(uniques))
它引发值错误:ValueError:格式字符串中的空属性
。在uniques
周围使用括号没有帮助。我真的不明白为什么?有人能澄清一下吗
在第一种情况下,列表是否解压缩后转换为元组,而在第二种情况下,这不是因为列表不能立即按格式转换为元组,就像
format(uniques[0],uniques[1])
一样?如果我是对的,为什么会是这样,因为有一个元组(列表)
函数来做这件事,所以它非常简单?您的格式字符串中有一个输入错误:
print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques))
您的格式字符串中有输入错误:
print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques))
您正在混合属性和订阅语法<代码>0。[0]告诉格式按名称[0]
查找属性。但是,只允许a跟在点后面(表示由字母、数字和下划线组成的单词,以字母或下划线开头),并且[0]
与该规则不匹配,因此您会得到一个错误,即根本没有属性名称
去掉这些点:
print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques))
这现在起作用了,因为格式分析器现在可以正确地看到订阅:
>>> uniques = [0, 0]
>>> print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques))
Task finished. 0 retrieved out of 0 tested
>>> uniques = [42, 81]
>>> print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques))
Task finished. 42 retrieved out of 81 tested
0[0]
说明符告诉str.format
解析器使用第一个位置参数(这里由uniques
提供),然后通过订阅[0]
将其作为一个序列进行威胁,因此第一个元素
使用“…”.format(*uniques)
时,任何iterable都可以,无论是列表、元组还是其他类型的iterable(包括生成器);Python对其进行迭代以生成单独的参数。对于[42,81]
,这意味着Python将调用该方法,就像您使用'…'调用它一样。format(42,81)
。在字符串格式中,您必须使用{0}
和{1}
处理这些单独的参数,因为您混合了属性和订阅语法<代码>0。[0]告诉格式按名称[0]
查找属性。但是,只允许a跟在点后面(表示由字母、数字和下划线组成的单词,以字母或下划线开头),并且[0]
与该规则不匹配,因此您会得到一个错误,即根本没有属性名称
去掉这些点:
print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques))
这现在起作用了,因为格式分析器现在可以正确地看到订阅:
>>> uniques = [0, 0]
>>> print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques))
Task finished. 0 retrieved out of 0 tested
>>> uniques = [42, 81]
>>> print('Task finished. {0[0]} retrieved out of {0[1]} tested'.format(uniques))
Task finished. 42 retrieved out of 81 tested
0[0]
说明符告诉str.format
解析器使用第一个位置参数(这里由uniques
提供),然后通过订阅[0]
将其作为一个序列进行威胁,因此第一个元素
使用
“…”.format(*uniques)
时,任何iterable都可以,无论是列表、元组还是其他类型的iterable(包括生成器);Python对其进行迭代以生成单独的参数。对于[42,81]
,这意味着Python将调用该方法,就像您使用'…'调用它一样。format(42,81)
。在字符串格式中,您必须使用{0}
和{1}
处理这些单独的参数,“…”格式(*(uniques,))有效吗?不有效。谢谢你的帮助。当你回答时,我详细阐述了我的帖子,最后是编辑?啊,很抱歉我没有正确地阅读问题:)格式(*(uniques,)有效吗?不有效。谢谢你的帮助。当你回答时,我详细阐述了我的帖子,最后是编辑?啊,对不起,我没有正确地阅读问题:)我想这里没有答案,我怎么会这么笨,但你太棒了!我想不管怎样,*列表更像是python式的和正式的,但我想确保理解其中的机制,即使我不想使用它。只是为了高兴和心灵的平静。@AndoJurai:这取决于你们想做什么;如果模板数量可变,那么使用带有属性或订阅的命名槽可以非常有效地使这些模板更加灵活,可以使用template.format(**mapping)
对它们应用整个名称空间映射。我想我怎么会这么笨,这里没有答案,但你太棒了!我想不管怎样,*列表更像是python式的和正式的,但我想确保理解其中的机制,即使我不想使用它。只是为了高兴和心灵的平静。@AndoJurai:这取决于你们想做什么;如果模板数量可变,则使用带有属性或订阅的命名插槽是使这些模板更加灵活的一种非常有效的方法,可以使用template.format(**mapping)
对其应用整个命名空间映射。