字符串格式化方法调用——为什么是格式化方法?——一个小便利

未匹配的标注

格式化方法的最后一个基本原理——它是一个函数,可以出现在表达式不能出现的任何地方——需要关于函数的比本书目前提到的更多信息,所以我们在这里不会详述它。只需要知道: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.formatbug(或回退) 说明,关于没有定义 __format__处理程序的对象属性的通用空替换目标。这影响了本书上一个版本中的工作示例。虽然它可能是一个临时的回退,但至少强调了这个方法仍然有点在一直变动——这是质疑它所暗示的功能冗余的另一个原因。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~