【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]: ...
随机推荐
- iOS发送短信
iPhone开发,发送短信的方法: iPhone开发中,发送短信方法有二: 1.URL Scheme,这样不可以设置短信内容 1 2 3 [[UIApplication sharedApplicati ...
- Docker容器管理
容器是Docker第二个核心概念,简单的的说容器是镜像的一个运行实例,所不同的是,它带有额外的可写文件层. 如果说虚拟机是模拟运行了一整套操作系统(提供运行态环境和其他系统环境)和跑在上面的应用.那么 ...
- Access 2003版数据库在Win7 64位系统下的不适应
使用ODBC连接不适应 使用microsoft.jet.4.0链接会出现“未在本地计算机上注册microsoft.jet.4.0” 应使用 Provider=Microsoft.ACE.OLEDB.1 ...
- 第五篇 Replication:事务复制-How it works
本篇文章是SQL Server Replication系列的第五篇,详细内容请参考原文. 这一系列包含SQL Server事务复制和合并复制的详细内容,从理解基本术语和设置复制的方法,到描述它是如何工 ...
- ArcEngine和GDAL读写栅格数据机制对比(二)—— IPixelBlock读写栅格
以下是设定一个矩形框,用IPixelBlock将256*256瓦片tile拼接成一个整块影像的代码,row1, col1, row2, col2是一个矩形框行列号范围.level是瓦片的金字塔等级.这 ...
- 【推荐】使用Jquery+EasyUI进行框架项目开发案例讲解之一---员工管理源码分享
使用Jquery+EasyUI 进行框架项目开发案例讲解之一 员工管理源码分享 在开始讲解之前,我们先来看一下什么是Jquery EasyUI?jQuery EasyUI是一组基于jQuery的U ...
- Java5、Java6、Java7的新特性
Java5 Java 5添加了8个语言特性:泛型,类型安全枚举,注解,自动装箱和拆箱,增强的循环,静态导入,可变参数,协变返回类型. 1.泛型 Generics: 引用泛型之后,允许指定集合里元素的类 ...
- 编写简单的Mapreduce程序并部署在Hadoop2.2.0上运行
今天主要来说说怎么在Hadoop2.2.0分布式上面运行写好的 Mapreduce 程序. 可以在eclipse写好程序,export或用fatjar打包成jar文件. 先给出这个程序所依赖的Mave ...
- C++Primer 第三章
//1.位于头文件中的代码一般不应该使用using声明.这是因为头文件的内容会拷贝到所有引用它的文件中,可能会产生始料未及的命名空间冲突. // 三种使用命名空间中的名字的方法 using names ...
- PHP Parse Error: syntax error, unexpected $end 错误的解决办
可以在php.ini中设置short_open_tag = On 第一步,登录到sql命令行 第二步,使用sql语句修改root密码 使用sql语句改密码时一定要选中数据库 .使用 use mys ...