码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-08-21 22:45:41      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

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

解决方法: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!