2017-10-20 53 views
0

我有一段代码如下:如何格式说明取值,而元组列表被传递

tupvalue = [('html', 96), ('css', 115), ('map', 82)] 

所以在打印时在所希望的格式的上述元组用于特定索引I找到一个这样的代码:

>>> '%s:%d' % tupvalue[0] 
'html:96' 

我想知道如何单值tupvalue[0]被识别为格式说明'%s:%d'两个值的元组?请用文档参考来解释这个机制。

如何使用理解,以所需格式格式化tupvalue中的所有值,如示例所示?

+0

'tupvalue [0]' - >'('html',96)' - >''%s:%d'%('html',96)'什么是混淆? –

+0

@julien在问题 – Sjn73

+0

@cᴏʟᴅsᴘᴇᴇᴅ中如何显示样本输出格式说明符%s和%d如何从单个输入值tupvalue [0] – Sjn73

回答

2

首先,简单的问题:

如何使用一个理解的格式中的所有值tupvalue以所需的格式如示例所示?

这是一个列表理解:['%s:%d' % t for t in tupvalue]

现在,更难的问题!

如何单值tupvalue[0]识别为格式指示符'%s:%d'两个值的元组?

你的直觉有点奇怪,这里是正确的。 元组是以字符串格式设置的语言专用的。

>>> '%s:%d' % ('css', 115) # tuple is seen as two elements 
'css:115' 
>>> '%s:%d' % ['css', 115] # list is just seen as one object! 
TypeError: not enough arguments for format string 

百分比样式的字符串格式不正确地鸭式输入。所以,如果你真的想格式化一个元组,你必须把它包在另一元组,不同于其他任何类型的对象:

>>> '%s' % [] 
'[]' 
>>> '%s' % ((),) 
'()' 
>>> '%s' %() 
TypeError: not enough arguments for format string 

文档的相关章节是部分4.7.2. printf-style String Formatting,它在哪里提到:

如果format需要单个参数,则值可能是单个非元组对象。否则,值必须是具有格式字符串指定的项目数的元组。

元组的奇怪处理是文档的该部分开头的注释中所指出的怪癖之一,建议使用较新的字符串格式化方法str.format的原因之一。

请注意,字符串格式的处理发生在运行时。你可以用抽象语法树来验证这一点:

>>> import ast 
>>> ast.dump(ast.parse('"%s" % val')) 
"Module(body=[Expr(value=BinOp(left=Str(s='%s'), op=Mod(), right=Name(id='val', ctx=Load())))])" 

'%s' % val解析对'%s'val二进制运算,这就好比str.__mod__(val)处理,在CPython的,这是一个BINARY_MODULO操作码。这意味着当val收到的信息不正确时*通常可以由str类型决定如何处理,只有在表达式为时才会发生,即一旦解释程序到达该行。所以,val是不是类型错误或者元素太少/太多并不重要 - 这是运行时错误,而不是语法错误。

除了在某些特殊情况下,CPython的窥视优化器能够在编译时“不断折叠”它。

*除非val的类型的子类str,在这种情况下type(val).__rmod__should be能够控制结果。

+2

我很欣赏这一点,它非常有用。我希望OP决定接受你的答案。 –

+0

@wim感谢这样一个彻底的解释,并通过与这个列表比较来完成我的问题>>>'%s:%d'%['css',115]',其实这就是我的问题出现的地方 – Sjn73