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

解决方法: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.给字符串中的变量名做插值处理的更多相关文章

  1. PHP 自定义字符串中的变量名解析

    PHP 自定义字符串中的变量名解析   这样一个需求:页面的 title 可以在后台自定义,自定义内容中可能包含变量,变量用 {$var} 表示, 其中 $var 为变量名 将 title 字段存入数 ...

  2. 【python cookbook】【字符串与文本】14.字符串连接及合并

    问题:将许多小字符串合并成一个大的字符串 解决方案: 1.针对少数量的字符串:+ 2.针对大量的字符串对象的连接,更高效的方法:join() 3.更加复杂的字符串:format() >>& ...

  3. 《Python Cookbook v3.0.0》Chapter2 字符串、文本

    感谢: https://github.com/yidao620c/python3-cookbook 如有侵权,请联系我整改. 本文章节会严格按照原书(以便和原书对照,章节标题可能会略有修改),内容会有 ...

  4. shell的字符串和数字的转化(数字自动做字符串处理,变量名做字符串输出用单引号)

    shell里面怎么样把字符串转换为数字? 例如:a="024" 1,用${{a}} 2,用let达到(()) 运算效果. let num=0123; echo $num; 83 3 ...

  5. 【python cookbook】【数据结构与算法】19.同时对数据做转换和换算

    问题:我们需要调用一个换算函数(例如sum().min().max()),但是首先需对数据做转换或者筛选处理 解决方案:非常优雅的方法---在函数参数中使用生成器表达式 例如: # 计算平方和 num ...

  6. python趣味——与MS系列编译器一样强大的Unicode变量名支持

    中文变量名,中文函数名,中文类名等,可惜Python2不支持,但在Python3时代,这些都可以完美支持了. def 中文函数(): return 1

  7. python中关于变量名失效的案例

    案例一:传参动态导入模块. selectModule = input("please input your module name") app_name = input(" ...

  8. [转]python3字符串与文本处理

    转自:python3字符串与文本处理 阅读目录 1.针对任意多的分隔符拆分字符串 2.在字符串的开头或结尾处做文本匹配 3.利用shell通配符做字符串匹配 4.文本模式的匹配和查找 5.查找和替换文 ...

  9. python3字符串与文本处理

    每个程序都回涉及到文本处理,如拆分字符串.搜索.替换.词法分析等.许多任务都可以通过内建的字符串方法来轻松解决,但更复杂的操作就需要正则表达式来解决. 1.针对任意多的分隔符拆分字符串 In [1]: ...

随机推荐

  1. 读取XML文档结构并写入内容

    1.在项目中新建XML文档结构.xsd文件,在其中添加相应的节点. 2.读取文档结构并写入内容 string initFileName = @"D:\Config.xml"; Da ...

  2. 7z usecaes

    1. Archive without compressing 7z a -t7z -mx=0 OutputFilename InputFilename Descryption: a: command, ...

  3. PHP如何解决网站大流量与高并发的问题

    首先,确认服务器硬件是否足够支持当前的流量. 普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则怎么优化都不可能彻 ...

  4. 添加gogs服务后 web丢失样式问题

    暂时的解决办法

  5. 查看oracle 数据库的DBID

    (1)使用rman查看$ rman target /Recovery Manager: Release 11.2.0.4.0 - Production on Fri Jun 12 03:20:19 2 ...

  6. Java基础之集合框架——使用集合Vector<>挑选演员(TryVector)

    控制台程序. public class Person implements Comparable<Person> { // Constructor public Person(String ...

  7. Java基础之读文件——使用缓冲读取器读取文件(ReaderInputFromFile)

    控制台程序,本例读取Java基础之写文件部分(WriterOutputToFile)写入的Saying.txt. import java.io.*; import java.nio.file.*; i ...

  8. Nodejs解决2分钟限制

    摘要:解决:在nodejs中调用服务,若超过2分钟服务没有返回数据,node会再次请求服务.  加班的日子总算暂时结束了,才发现下午6点钟的天还没有黑!开始我的总结吧... 去年的某个项目用nodej ...

  9. codeforces 70D Professor's task(动态二维凸包)

    题目链接:http://codeforces.com/contest/70/problem/D Once a walrus professor Plato asked his programming ...

  10. 1021: A除以B

    1021: A除以B 时间限制: 1 Sec  内存限制: 128 MB提交: 263  解决: 189[提交][状态][讨论版] 题目描述 本题要求计算A/B,其中A是不超过1000位的正整数,B是 ...