标签:
问题:想创建一个字符串,其中嵌入的变量名称会以变量的字符串值形式替换掉
解决方法:str.format()、str.format_map()
>>> s = ‘{name} has {n} messages.‘ >>> s.format(name=‘Guido‘,n=37) ‘Guido has 37 messages.‘ >>> name=‘Guido‘ >>> n=37 >>> s.format_map(vars()) ‘Guido has 37 messages.‘ >>> #以上是另一种方式,即如果要被替换的值确实能在变量中找到,则可以将format_map()和vars()联合起来使用 >>>
vars()的一个微妙特性是它也能作用于类实例上:
>>> s = ‘{name} has {n} messages.‘ >>> class Info: def __init__(self,name,n): self.name=name self.n=n >>> a=Info(‘Guido‘,37) >>> s.format_map(vars(a)) ‘Guido has 37 messages.‘ >>>
而format()与format_map()的一个缺点则是没法优雅的处理缺少某个值的情况。
>>> s.format(name=‘Guido‘) Traceback (most recent call last): File "<pyshell#76>", line 1, in <module> s.format(name=‘Guido‘) KeyError: ‘n‘ >>>
避免这种情况的一种方法是单独定义一个带有__missing__()方法的字典类,例如:
>>> class safesub(dict): def __missing__(self, key): return ‘{%s}‘ % key >>> s = ‘{name} has {n} messages.‘ >>> del n #确保n是非定义的 >>> print(s.format_map(safesub(vars()))) Guido has {n} messages. >>>
若在代码中常常需要执行这些操作,则可以将替换变量的过程隐藏在一个小型的功能函数内,这里成为一种‘frame hack’的技巧-即需要和函数的栈帧打交道,sys._getframe这个特殊的函数可以让我们获得调用函数的栈信息。
class safesub(dict): def __missing__(self, key): return ‘{%s}‘ % key s = ‘{name} has {n} messages.‘ # (c) Safe substitution + frame hack n = 37 import sys def sub(text): return text.format_map(safesub(sys._getframe(1).f_locals)) print(sub(‘Hello {name}‘)) print(sub(‘{name} has {n} messages‘)) print(sub(‘Your favorite color is {color}‘))
>>> ================================ RESTART ================================ >>> Hello {name} {name} has 37 messages Your favorite color is {color} >>>
【python cookbook】【字符串与文本】15.给字符串中的变量名做插值处理
标签:
原文地址:http://www.cnblogs.com/apple2016/p/5793659.html