global format() 函数的用途是什么?
What is global format() function meant for?
python 中有一个我熟悉的 str.format()
方法,但它的工作方式与 format()
函数(全局内置)不同。
全局 format()
函数的用途是什么?
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()
operates on the matched values and applies just the 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()
可能会对那个钩子的结果进行更多处理,或者 pre-process 传递的格式。这都是一个真正的实现细节,只有在你想为你的对象类型实现你自己的格式化语言。
请参阅 PEP-3101 Advanced String Formatting 以了解向语言添加 str.format()
、format()
和 object.__format__
挂钩的原始提案。
要添加到 Martin 的回答中,请查看 PEP3101 提案:
Each Python type can control formatting of its instances by defining
a __format__
method. The __format__
method is responsible for
interpreting the format specifier, formatting the value, and
returning the resulting string.
The new, global built-in function 'format' simply calls this special
method, similar to how len()
and str()
simply call their respective
special methods:
def format(value, format_spec):
return value.__format__(format_spec)
It is safe to call this function with a value of "None" (because the
"None" value in Python is an object and can have methods.)
Several built-in types, including 'str', 'int', 'float', and 'object'
define __format__
methods. This means that if you derive from any of
those types, your class will know how to format itself.
str.format() 方法和 Formatter class 共享格式字符串的相同语法(尽管在 Formatter 的情况下,subclasses 可以定义自己的格式字符串语法)。
格式字符串包含用花括号 {} 包围的“替换字段”。大括号中未包含的任何内容都被视为文字文本,将原封不动地复制到输出中。如果您需要在文字文本中包含大括号字符,可以通过加倍转义:{{ 和}}。
替换字段的语法如下:
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 依次为 0, 1, 2, ... ,则可以将它们全部省略(不只是一些)并且数字 0, 1, 2, ... 将是按顺序自动插入。因为 arg_name 不是引号分隔的,所以不可能在格式字符串中指定任意字典键(例如,字符串“10”或“:-]”)。 arg_name 后面可以跟任意数量的索引或属性表达式。形式为“.name”的表达式使用 getattr() 选择命名属性,而形式为“[index]”的表达式使用 getitem() 进行索引查找。
在 2.7 版中更改:位置参数说明符可以省略,因此“{} {}”等同于“{0} {1}”。
如 Python 文档中所述
python 中有一个我熟悉的 str.format()
方法,但它的工作方式与 format()
函数(全局内置)不同。
全局 format()
函数的用途是什么?
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()
operates on the matched values and applies just the 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()
可能会对那个钩子的结果进行更多处理,或者 pre-process 传递的格式。这都是一个真正的实现细节,只有在你想为你的对象类型实现你自己的格式化语言。
请参阅 PEP-3101 Advanced String Formatting 以了解向语言添加 str.format()
、format()
和 object.__format__
挂钩的原始提案。
要添加到 Martin 的回答中,请查看 PEP3101 提案:
Each Python type can control formatting of its instances by defining a
__format__
method. The__format__
method is responsible for interpreting the format specifier, formatting the value, and returning the resulting string.The new, global built-in function 'format' simply calls this special method, similar to how
len()
andstr()
simply call their respective special methods:def format(value, format_spec): return value.__format__(format_spec)
It is safe to call this function with a value of "None" (because the "None" value in Python is an object and can have methods.)
Several built-in types, including 'str', 'int', 'float', and 'object' define
__format__
methods. This means that if you derive from any of those types, your class will know how to format itself.
str.format() 方法和 Formatter class 共享格式字符串的相同语法(尽管在 Formatter 的情况下,subclasses 可以定义自己的格式字符串语法)。
格式字符串包含用花括号 {} 包围的“替换字段”。大括号中未包含的任何内容都被视为文字文本,将原封不动地复制到输出中。如果您需要在文字文本中包含大括号字符,可以通过加倍转义:{{ 和}}。
替换字段的语法如下:
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 依次为 0, 1, 2, ... ,则可以将它们全部省略(不只是一些)并且数字 0, 1, 2, ... 将是按顺序自动插入。因为 arg_name 不是引号分隔的,所以不可能在格式字符串中指定任意字典键(例如,字符串“10”或“:-]”)。 arg_name 后面可以跟任意数量的索引或属性表达式。形式为“.name”的表达式使用 getattr() 选择命名属性,而形式为“[index]”的表达式使用 getitem() 进行索引查找。
在 2.7 版中更改:位置参数说明符可以省略,因此“{} {}”等同于“{0} {1}”。
如 Python 文档中所述