python字符串模板中的KeyError

本文介绍了 Python 中 string 模块的 Template 类用法,包括 substitute() 和 safe_substitute() 方法的区别。通过实例展示了如何使用这些方法进行字符串替换,并讨论了参数缺失时的不同行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于新式的字符串Template对象的引进使得string 模块又重新活了过来,Template对象有两个方法:substitute()和safe_substitute()。

python中string的Template类似C语言中printf中的<格式化字符串>,使用“${*}”声明变量(类似C语言中的"%*");紧跟substitute则类似printf的<变量参数表>,必须一一对应,数量必须严格匹配。

当缺少参数(key)时,substitute会报一KeyError的异常出来;而safe_substitute则会直接原封不动的把字符串显示出来。

>>> from string import Template

>>> s =Template('There are ${howmany} ${lang} Quotation Symbols')  #声明模板

>>> print s.substitute(lang='Python', howmany=3)  #给变量传参

>>>There are 3 Python Quotation Symbols#正常输出

>>>

>>> print s.substitute(lang='Python')  #缺少key:${howmany}

>>> Traceback (most recent call last):

File "<stdin>", line 1, in ?
File "/usr/local/lib/python2.4/string.py", line 172, in substitute
return self.pattern.sub(convert, self.template)
File "/usr/local/lib/python2.4/string.py", line 162, in convert val =  mapping[named]
KeyError: 'howmany' #substitute异常报错
>>>
>>> print s.safe_substitute(lang='Python')

There are${howmany} Python Quotation Symbols #safe_substitute异常报错,缺少参数


比较矬的是,我在sql语句的--注释中出现了“${YYYYMMDD}”,结果被Template当成了变量,害我找了很久:


### Python模板字符串的用法 在 Python 中,模板字符串提供了一种简单而安全的方式来处理字符串插值[^3]。相比于传统的 `%` 格式化以及 `.format()` 方法,模板字符串具有更为直观的语法,并且特别适用于需要进行国际化(i18n)的应用场景。 #### 基于 `$` 的替换规则 模板字符串支持基于 `$` 符号来标记待替换字段。具体来说: - 如果变量名紧跟在美元符号后面,则表示该位置会被相应变量的实际值所替代。 - 若要表达实际的美元符号字符,在模板中应写成 `$$`。 下面给出几个具体的例子以便更好地理解这一机制: ```python from string import Template name = "Alice" age = 30 # 创建一个简单的模板对象 s = Template('$name is $age years old.') print(s.substitute(name=name, age=age)) # 输出: Alice is 30 years old. # 处理带有默认值的情况 t = Template('User: ${username}, Password: ${password:-no password}') print(t.substitute(username="admin")) # 输出: User: admin, Password: no password # 当存在未指定键时抛出异常 try: s.substitute(name=name) except KeyError as e: print(f'Missing key {e}') # 输出: Missing key 'age' # 安全地忽略缺失键而不引发错误 u = Template('Name=$name Age=${age}').safe_substitute(name='Bob') print(u) # 输出: Name=Bob Age=${age} ``` 通过上述代码片段可以看出,模板字符串不仅能够方便快捷地完成基本的数据填充操作,还具备良好的灵活性以应对不同情况下的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值