字符串格式化方法调用——为什么是格式化方法?——一个小便利
格式化方法的最后一个基本原理 —— 它是一个函数,可以出现在表达式不能出现的任何地方 —— 需要关于函数的比本书目前提到的更多信息,所以我们在这里不会详述它。只需要知道:str.format
方法和 format
内置函数可以传递给其它函数,存储在其它对象中等等。像 % 的表达式不能直接这么做,但这可能是目光短浅了 —— 将任何表达式包裹在一个单行的 def
或 partial-line 的 lambda
中一次,来将它转换为有同样属性的函数是很简单的(然而找到一个理由这么做可能更具有挑战性):
def myformat(fmt, args): return fmt % args # See Part IV
myformat('%s %s', (88, 99)) # Call your function object
str.format('{} {}', 88, 99) # Versus calling the built-in
otherfunction(myformat) # Your function is an object too
最后,这可能不是一个二选一的问题。虽然表达式在 Python 代码中似乎仍更普遍,但今天格式化表达式和方法都可用,且大多数程序员在今后的数年内都将受益于熟悉这两个技术。这将使得在这个领域中的语言新手的工作量加倍,但在这个我们称为开源软件世界的思想集市中,开起来总有空间来容纳更多(思想)[17]。
注意:
再来一个:技术上讲,如果包含之前提到的鲜为人知的 string
模块的 Template
工具,在 Python 中内置了 3(而非 2)种格式化工具。现在我们已经看了其它两种,我可以向你展示它是如何比较的。表达式和方法也可以被用作模板工具,通过字典键或关键字参数,按名称指向替换值:
>>> '%(num)i = %(title)s' % dict(num=7, title='Strings')
'7 = Strings'
>>> '{num:d} = {title:s}'.format(num=7, title='Strings')
'7 = Strings'
>>> '{num} = {title}'.format(**dict(num=7, title='Strings'))
'7 = Strings'
模块的模板系统还允许值被名称(和字典键或关键字一样)引用,以 $
作为前缀,但并不支持其它两种方法所有的功能 —— 产生简单性(使用此工具的主要动机)的一个限制:
>>> import string
>>> t = string.Template('$num = $title')
>>> t.substitute({'num': 7, 'title': 'Strings'})
'7 = Strings'
>>> t.substitute(num=7, title='Strings')
'7 = Strings'
>>> t.substitute(dict(num=7, title='Strings'))
'7 = Strings'
参见 Python 手册获得更详细的信息。在 Python 代码中也可能看到这个可选方法(还有第三方领域中的额外工具);幸好这个技术很简单,且被使用得足够少来保证这里的篇幅是有限的。对今天大多数新手来说,最好的选择是同时学习和使用 % 和 str.format
。
Note17:#
另请参见第 31 章的关于 3.2 和 3.3 版本中的一个 str.format
bug(或回退) 说明,关于没有定义 __format__
处理程序的对象属性的通用空替换目标。这影响了本书上一个版本中的工作示例。虽然它可能是一个临时的回退,但至少强调了这个方法仍然有点在一直变动 —— 这是质疑它所暗示的功能冗余的另一个原因。
推荐文章: