【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}
>>>
【python cookbook】【字符串与文本】15.给字符串中的变量名做插值处理的更多相关文章
- PHP 自定义字符串中的变量名解析
PHP 自定义字符串中的变量名解析 这样一个需求:页面的 title 可以在后台自定义,自定义内容中可能包含变量,变量用 {$var} 表示, 其中 $var 为变量名 将 title 字段存入数 ...
- 【python cookbook】【字符串与文本】14.字符串连接及合并
问题:将许多小字符串合并成一个大的字符串 解决方案: 1.针对少数量的字符串:+ 2.针对大量的字符串对象的连接,更高效的方法:join() 3.更加复杂的字符串:format() >>& ...
- 《Python Cookbook v3.0.0》Chapter2 字符串、文本
感谢: https://github.com/yidao620c/python3-cookbook 如有侵权,请联系我整改. 本文章节会严格按照原书(以便和原书对照,章节标题可能会略有修改),内容会有 ...
- shell的字符串和数字的转化(数字自动做字符串处理,变量名做字符串输出用单引号)
shell里面怎么样把字符串转换为数字? 例如:a="024" 1,用${{a}} 2,用let达到(()) 运算效果. let num=0123; echo $num; 83 3 ...
- 【python cookbook】【数据结构与算法】19.同时对数据做转换和换算
问题:我们需要调用一个换算函数(例如sum().min().max()),但是首先需对数据做转换或者筛选处理 解决方案:非常优雅的方法---在函数参数中使用生成器表达式 例如: # 计算平方和 num ...
- python趣味——与MS系列编译器一样强大的Unicode变量名支持
中文变量名,中文函数名,中文类名等,可惜Python2不支持,但在Python3时代,这些都可以完美支持了. def 中文函数(): return 1
- python中关于变量名失效的案例
案例一:传参动态导入模块. selectModule = input("please input your module name") app_name = input(" ...
- [转]python3字符串与文本处理
转自:python3字符串与文本处理 阅读目录 1.针对任意多的分隔符拆分字符串 2.在字符串的开头或结尾处做文本匹配 3.利用shell通配符做字符串匹配 4.文本模式的匹配和查找 5.查找和替换文 ...
- python3字符串与文本处理
每个程序都回涉及到文本处理,如拆分字符串.搜索.替换.词法分析等.许多任务都可以通过内建的字符串方法来轻松解决,但更复杂的操作就需要正则表达式来解决. 1.针对任意多的分隔符拆分字符串 In [1]: ...
随机推荐
- java版本区别
java版本区别 点我,点我,Eclipse几个版本号的区别(part1) 点我,点我,Eclipse几个版本号的区别(part2) 点我,点我,Eclipse几个版本号的区别(part3)
- iOS:后台定位并实时向服务器发送位置
第一步:开启后台模式,选中定位,选择project --> capabilities-->Backgorund Modes --> Location updates 如图: 第二步: ...
- Android 自定义控件之app标题栏的封装
在app的开发中,每一个页面都有上面的标题栏,总不能在开发的过程中没个界面都写一个标题栏的布局,所以为了开发的方便,将该标题栏进行的封装,以后在实际的开发工作中,也可以将该封装好的标题栏控件直接拿来使 ...
- Inside Flask - app.py - 1
Inside Flask - app.py - 1 除 werkzeug 和 jinja2 等依赖库外,app.py 是在 Flask 的 __init__.py 中导入的第一个 Flask 自身的模 ...
- Ionic 小节
教程 http://www.runoob.com/ionic/ionic-install.html 最后报错,发现是jdk版本过低,升级到8.0后正常 分析:nodejs.cordova.ionic. ...
- 使用Storm实现实时大数据分析
摘要:随着数据体积的越来越大,实时处理成为了许多机构需要面对的首要挑战.Shruthi Kumar和Siddharth Patankar在Dr.Dobb’s上结合了汽车超速监视,为我们演示了使用Sto ...
- 10月12号 晚八点 Speed-BI 云平台-基于Excel数据源的管理驾驶舱构建全过程,腾讯课堂开课啦
认真地做了一大摞一大摞的报表,老板没时间看?努力把能反馈的内容都融汇进图表里,老板嫌复杂?做了几个简单的报表,老板一眼就觉得信息不全面?每个报表都用了各种各样的图表,老板却毫无兴趣?明明很努力了,为什 ...
- 发起post请求
string postUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo"; //string req ...
- sql server 还原数据库时提示数据库正在使用,无法进行操作的解决方法
这个问题的原因在于有用户连接了当前要做还原的数据库,这里的用户甚至包括当前要做还原的用户.解决办法就是关闭与要还原数据库的所有连接. 脚本之家小编推荐的一个方法:到服务里面重启下sqlserver服务 ...
- TDE与列级数据加密
一.测试TDE此部分内容扩展SQL Server安全系列的第九篇:SQL Server安全透明数据加密的测试TDE章节.启用TDE的详细步骤请参考原文. -- Create a test databa ...