首先,简单的问题:
如何使用一个理解的格式中的所有值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能够控制结果。
来源
2017-10-20 05:23:48
wim
'tupvalue [0]' - >'('html',96)' - >''%s:%d'%('html',96)'什么是混淆? –
@julien在问题 – Sjn73
@cᴏʟᴅsᴘᴇᴇᴅ中如何显示样本输出格式说明符%s和%d如何从单个输入值tupvalue [0] – Sjn73