【python cookbook】【字符串与文本】15.给字符串中的变量名做插值处理

问题:想创建一个字符串,其中嵌入的变量名称会以变量的字符串值形式替换掉

解决方法: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}
>>> 
原文地址:https://www.cnblogs.com/apple2016/p/5793659.html