Python global format()函数的作用是什么?

Python global format()函数的作用是什么?,python,string-formatting,Python,String Formatting,python中有一个我熟悉的str.format()方法,但是它的工作方式与format()函数(全局内置)不同 全局format()函数的用途是什么?根据格式化规范格式化一个值 解析出一个模板,然后格式化各个值。每个{value\u reference:format\u spec}说明符基本上使用format()函数应用于匹配的值,如format(referenced\u value,format\u spec) 换句话说,str.format()构建在format()函数之上str.form

python中有一个我熟悉的
str.format()
方法,但是它的工作方式与
format()
函数(全局内置)不同

全局
format()
函数的用途是什么?

根据格式化规范格式化一个值

解析出一个模板,然后格式化各个值。每个
{value\u reference:format\u spec}
说明符基本上使用
format()
函数应用于匹配的值,如
format(referenced\u value,format\u spec)

换句话说,
str.format()
构建在
format()
函数之上
str.format()
对完整值进行操作,
format()
对匹配的值进行操作,并仅应用匹配的值

例如,在表达式中

'The hex value of {0:d} is {0:02x}'.format(42)
模板字符串有两个模板槽,都将相同的参数格式化为
str.format()
方法。第一个插值
格式(42,'d')
的输出,另一个插值
格式(42,'02x')
。请注意,两种情况下的第二个参数都是格式说明符,例如模板占位符中
冒号之后的所有内容

如果只想格式化单个值,请使用
format()
函数;如果要将格式化值放入较大的字符串,请使用
str.format()

在引擎盖下,
format()
将委托给
对象。\uuuuu format\uuuuu
方法,让值本身解释格式化规范
str.format()
object.\uu格式\uu
是一个钩子,将来
format()
可能会对该钩子的结果应用更多处理,或者预处理要传入的格式。这实际上是一个实现细节,只有当您想要为您的对象类型实现自己的格式化语言时才有意思


请参阅添加了
str.format()
format()
对象的原始提案。

要添加到Martin的答案中,请查看PEP3101提案:

每种Python类型都可以通过定义 一种
\uuuuuuuuuuuuuu格式
方法。
\uuuu格式\uuuu
方法负责 解释格式说明符,格式化值,以及 返回结果字符串

新的全局内置函数“format”只是调用这个特殊的 方法,类似于
len()
str()
只调用各自的 特别方法:

def format(value, format_spec):
    return value.__format__(format_spec)
使用“None”值调用此函数是安全的(因为 Python中的“None”值是一个对象,可以有方法。)

几个内置类型,包括“str”、“int”、“float”和“object” 定义
格式方法。这意味着,如果你从
对于这些类型,您的类将知道如何格式化自己

.

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>
replacement\u field::=“{”[字段名称][“!”转换][“:“格式规格]”}”
字段_名称::=arg_名称(“.attribute_name |”[“element_index”]”)*
arg_name::=[标识符|整数]
属性名称::=标识符
元素_索引::=整数|索引_字符串
索引字符串::=+
转换::=“r”|“s”
格式规格:
另请参见格式规范迷你语言部分

字段_name本身以arg_name开头,arg_name是数字或关键字。如果是数字,则表示位置参数;如果是关键字,则表示命名关键字参数。如果格式字符串中的数字arg_名称为0、1、2。。。按顺序,它们都可以省略(不仅仅是一些),数字0、1、2。。。将自动按该顺序插入。由于arg_name不以引号分隔,因此无法在格式字符串中指定任意字典键(例如字符串“10”或“:-]”)。arg_名称后面可以跟任意数量的索引或属性表达式。“.name”形式的表达式使用getattr()选择命名属性,而“[index]”形式的表达式使用getitem()进行索引查找

在版本2.7中更改:位置参数说明符可以省略,因此{}{}等价于{0}{1}。


正如Python文档

中提到的,但是我不能使用format(“hello”、“{hello}”)是一种特殊情况,而不是由format处理?@Har:
{hello}
是一个模板,而不是一个格式说明符。正确的调用是
格式('hello','')
;在您的示例中,格式说明符是空的。让我感到困惑的是Kikohs提到格式调用string _; format _;方法。那么这是否意味着uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这是一个实现细节。