导航:起始页 > Dive Into Python > HTML 处理 > 基于 dictionary 的字符串格式化 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 从新手到专家 [Dip_5.4b_CPyUG_Release] |
为什么学习 locals 和 globals?因为接下来就可以学习关于基于 dictionary 的字符串格式化。或许您还能记起,字符串格式化提供了一种将值插入字符串中的一种便捷的方法。值被列在一个 tuple 中,按照顺序插入到字符串中每个格式化标记所在的位置上。尽管这种做法效率高,但还不是最容易阅读的代码,特别是当插入多个值的时候。仅用眼看一遍字符串,您不能马上就明白结果是什么;您需要经常地在字符串和值的 tuple 之间进行反复查看。
有另外一种字符串格式化的形式,它使用 dictionary 而不是值的 tuple。
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> "%(pwd)s" % params 'secret' >>> "%(pwd)s is not a good password for %(uid)s" % params 'secret is not a good password for sa' >>> "%(database)s of mind, %(database)s of body" % params 'master of mind, master of body'
那么为什么您偏要使用基于 dictionary 的字符串格式化呢?的确,仅为了进行字符串格式化,就事先创建一个有键字和值的 dictionary 看上去的确有些小题大作。它的真正最大用处是当您碰巧已经有了像 locals 一样的有意义的键字和值的 dictionary 的时候。
def handle_comment(self, text): self.pieces.append("<!--%(text)s-->" % locals())
def unknown_starttag(self, tag, attrs): strattrs = "".join([' %s="%s"' % (key, value) for key, value in attrs]) self.pieces.append("<%(tag)s%(strattrs)s>" % locals())
当这个模块被调用时,attrs 是一个键/值 tuple 的 list,就像一个 dictionary 的 items。这就意味着我们可以使用多变量赋值来遍历它。到现在这将是一种熟悉的模式,但是这里有很多东西,让我们分开来看:
|
|
现在,使用基于 dictionary 的字符串格式化,我们将 tag 和 strattrs 的值插入到一个字符串中。所以,如果 tag 是 'a',最终的结果会是 '<a href="index.html" title="Go to home page">',并且这就是追加到 self.pieces 后面的东西。 |
使用 locals 来应用基于 dictionary 的字符串格式化是一种方便的作法,它可以使复杂的字符串格式化表达式更易读。但它需要花费一定的代价。在调用 locals 方面有一点性能上的问题,这是由于 locals 创建了局部名字空间的一个拷贝引起的。 |
<< locals 和 globals |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
给属性值加引号 >> |