Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字符串格式:何时使用!s转换标志_Python_String_String Formatting - Fatal编程技术网

Python字符串格式:何时使用!s转换标志

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

Python中这两个字符串格式语句的区别是什么:

'{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