字符串格式化方法调用——为什么是格式化方法?——一个小便利 | 第二部分 类型与操作 —— 第 7 章: 字符串基础 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-380玩彩网官网入口
格式化方法的最后一个基本原理——它是一个函数,可以出现在表达式不能出现的任何地方——需要关于函数的比本书目前提到的更多信息,所以我们在这里不会详述它。只需要知道: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__
处理程序的对象属性的通用空替换目标。这影响了本书上一个版本中的工作示例。虽然它可能是一个临时的回退,但至少强调了这个方法仍然有点在一直变动——这是质疑它所暗示的功能冗余的另一个原因。