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.

More info here.

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 文档中所述