Python字符串格式:何时使用!s转换标志
Python中这两个字符串格式语句的区别是什么:Python字符串格式:何时使用!s转换标志,python,string,string-formatting,Python,String,String Formatting,Python中这两个字符串格式语句的区别是什么: '{0}'.format(a) '{0!s}'.format(a) 如果a是整数、列表或字典,则两者的输出相同。第一个{0}正在执行隐式str()调用吗 关键词:感叹号/bang“!s”格式文档中提到: 转换字段在格式化之前导致类型强制。 通常,格式化值的工作由\uuuuuu format\uuuuuu() 值本身的方法。然而,在某些情况下,最好 强制将类型格式化为字符串,并重写其自身的 格式的定义。通过在之前将值转换为字符串 调用\uuuu
'{0}'.format(a)
'{0!s}'.format(a)
如果a
是整数、列表或字典,则两者的输出相同。第一个{0}
正在执行隐式str()
调用吗
关键词:感叹号/bang“!s”格式文档中提到: 转换字段在格式化之前导致类型强制。 通常,格式化值的工作由
\uuuuuu format\uuuuuu()
值本身的方法。然而,在某些情况下,最好
强制将类型格式化为字符串,并重写其自身的
格式的定义。通过在之前将值转换为字符串
调用\uuuuu format\uuuu()
,将绕过正常的格式化逻辑
当前支持两个转换标志:'!s
“调用
str()!r
,它调用repr()
可以举一个例子(同样来自)来说明区别:
>>> "repr() shows quotes: {!r}; str() doesn't: {!s}".format('test1', 'test2')
"repr() shows quotes: 'test1'; str() doesn't: test2"
感谢@hjpotter92的评论和回答: 下面是一个显示差异的示例(当您重写
\uuuuu格式\uuuu
方法时)
class-MyClass:
i=12345
定义格式(self,i):
返回'I Override'
>>>obj=MyClass()
>>>“{0}”。格式(obj)
“我超越”
>>>{0!s}.格式(obj)
''
简单地说:
将使用'{0}'。格式(a)
来显示值a的结果。\uuuuu format\uuuu()
将使用'{0!s}'。格式(a)
的结果来显示值a.\uu str\uu()
将使用'{0!r}'。格式(a)
的结果来显示值a.\uu repr\uu()
>>C类:
... 定义str(self):返回“str”
... def________(self):返回“repr”
... 定义格式(self,format_spec):返回“format as”+str(type(format_spec))
...
>>>c=c()
>>>打印“{0}”。格式(c)
格式为
>>>打印u“{0}”。格式(c)
格式为
>>>打印“{0!s}”。格式(c)
str
>>>打印“{0!r}”。格式(c)
报告
关于\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
的第二个参数,引用“基于每种类型控制格式”:
“format_spec”参数将为
字符串对象或unicode对象,具体取决于
原始格式字符串。\uuuuuuuuuuuuuuuuuuuu格式
方法应该测试类型
用于确定是否返回字符串或
unicode对象。这是\uuuu格式\uuuu
方法的责任
返回正确类型的对象
无论我使用
{0}
还是{0!s}
并使用字符串参数进行格式化,都会得到相同的结果。repr()
是如何出现在图片中的?@单击{x}
和{x!s}
将对字符串和整数给出相同的结果。如果定义了不同的\uuuuuu format\uuuuuuuu()
和\uuuu str\uuuuuuuuu()
(例如,对于某些自定义类,如向量或复数等),则会发生类型强制。对于{}
和{s}
,几乎总是会得到相同的结果,因为:一般约定是空格式字符串(“”)生成与对值调用str()相同的结果。
我知道的所有内置类型都遵循此约定。
class MyClass:
i = 12345
def __format__(self, i):
return 'I Override'
>>> obj = MyClass()
>>> '{0}'.format(obj)
'I Override'
>>> '{0!s}'.format(obj)
'<__main__.MyClass instance at 0x021AA6C0>'
>>> class C:
... def __str__(self): return "str"
... def __repr__(self): return "repr"
... def __format__(self, format_spec): return "format as " + str(type(format_spec))
...
>>> c = C()
>>> print "{0}".format(c)
format as <type 'str'>
>>> print u"{0}".format(c)
format as <type 'unicode'>
>>> print "{0!s}".format(c)
str
>>> print "{0!r}".format(c)
repr