我熟悉python中的str.format()
方法,但它与format()
函数(global-builtin)的工作方式不同。
全球format()
功能的目的是什么?
答案 0 :(得分:8)
根据格式规范,format()
function格式一个值。
str.format()
method解析模板,然后格式化各个值。每个{value_reference:format_spec}
说明符基本上都应用于匹配值,使用format()
函数,format(referenced_value, format_spec)
。
换句话说,str.format()
建立在format()
函数之上。 str.format()
运行完整Format String Syntax string,format()
对匹配的值进行操作,仅应用Format Specification Mini-Language。
例如,在表达式
中'The hex value of {0:d} is {0:02x}'.format(42)
模板字符串有两个模板 slots ,两者都格式化str.format()
方法的相同参数。第一个插值format(42, 'd')
,另一个format(42, '02x')
的输出。注意,两种情况下的第二个参数是格式说明符,例如在模板占位符中的:
冒号之后的所有内容。
如果只想格式化单个值,请使用format()
函数,如果要将格式化的值放在较大的字符串中,请使用str.format()
。
在幕后,format()
委托object.__format__
方法让值本身解释格式规范。 str.format()
直接调用该方法,但您不应该依赖此。 object.__format__
是一个钩子,将来format()
可能会对该钩子的结果应用更多处理,或者预先处理要传入的格式。这实际上是一个实现细节,只有你想要的才有意思为您的对象类型实现自己的格式化语言。
有关为该语言添加str.format()
,format()
和object.__format__
挂钩的原始提案,请参阅PEP-3101 Advanced String Formatting。
答案 1 :(得分:1)
要添加马丁的答案,请查看PEP3101提案:
每种Python类型都可以通过定义来控制其实例的格式 一个
__format__
方法。__format__
方法负责 解释格式说明符,格式化值,和 返回结果字符串。新的全球内置功能'格式'简单地称这个特别 方法,类似于
len()
和str()
简称为各自的方法 特殊方法:def format(value, format_spec): return value.__format__(format_spec)
使用"无"的值调用此函数是安全的。 (因为 "无" Python中的值是一个对象,可以有方法。)
几种内置类型,包括' str',' int',' float'和' object' 定义
__format__
方法。这意味着,如果你派生于任何一个 那些类型,你的班级将知道如何格式化自己。
答案 2 :(得分:1)
str.format()方法和Formatter类共享格式字符串的相同语法(尽管在Formatter的情况下,子类可以定义自己的格式字符串语法)。
格式字符串包含由大括号{}包围的“替换字段”。大括号中未包含的任何内容都被视为文本文本,它将不加改变地复制到输出中。如果您需要在文字文本中包含大括号字符,可以通过加倍来转义它:{{和}}。
替换字段的语法如下:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name ::= arg_name ("." attribute_name | "[" element_index "]")*
arg_name ::= [identifier | integer]
attribute_name ::= identifier
element_index ::= integer | index_string
index_string ::= <any source character except "]"> +
conversion ::= "r" | "s"
format_spec ::= <described in the next section>
另请参阅格式规范迷你语言部分。
field_name本身以arg_name开头,arg_name是数字或关键字。如果它是一个数字,它引用一个位置参数,如果它是一个关键字,它引用一个命名关键字参数。如果格式字符串中的数字arg_names按顺序为0,1,2,...,它们都可以省略(不仅仅是一些),数字0,1,2,...将按顺序自动插入。由于arg_name不是引号分隔的,因此无法在格式字符串中指定任意字典键(例如,字符串&#39; 10&#39;: - ]和#39;)。 arg_name后面可以跟任意数量的索引或属性表达式。表达形式&#39; .name&#39;使用getattr()选择命名属性,而表达式为&#39; [index]&#39;使用 getitem ()进行索引查找。
在版本2.7中更改:位置参数说明符可以省略,因此&#39; {} {}&#39;相当于&#39; {0} {1}&#39;。
如Python文档中提到的那样