python之字符串中插入变量

方法一:也是 比较好用的,功能教齐全

s="{name} is {sex}"
print(s.format(name="zzy",sex="girl"))   # zzy is girl
如果要被替换的变量能在变量域中找到, 那么你可以结合使用 format_map() 和 vars()
vars()找到所有局部变量
name="zxc"
sex="boy"
print(s.format_map(vars()))    # zxc is boy
vars() 还有一个有意思的特性就是它也适用于对象实例。
class Info:
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex

a=Info("zzz","beautiful")
print(s.format_map(vars(a)))   # zzz is beautiful

缺陷:format 和 format_map() 的一个缺陷就是它们并不能很好的处理变量缺失的情况

s = "{name} is {sex}"
print(s.format(name='Guido'))
报错:
"""
Traceback (most recent call last):
  File "/home/zzy/PycharmProjects/MyTest/littleTest.py", line 301, in <module>
    print(s.format(name='Guido'))
KeyError: 'sex'
"""

解决:

我们把参数sex 手动清除

s = "{name} is {sex}"
name = "zxc"
class safesub(dict):
    """防止key找不到"""

    def __missing__(self, key):
        return '{' + key + '}'


print(s.format_map(safesub(vars())))  # zxc is {sex}
# 映射或者字典类中鲜为人知的 __missing__() 方法可以让你定义如何处理缺失的值。 在 SafeSub 类中,这个方法被定义为对缺失的值返回一个占位符。 你可以发现缺失的值会出现在结果字符串中(在调试的时候可能很有用),而不是产生一个 KeyError 异常
如果你发现自己在代码中频繁的执行这些步骤,你可以将变量替换步骤用一个工具函数封装起来。就像下面这样:
import sys


def sub(text):
    return text.format_map(safesub(sys._getframe(1).f_locals))

print(sys._getframe().f_locals)
print(sub(s))   # zxc is {sex}


#注释:1:,sub() 函数使用 sys._getframe(1) 返回调用者的栈帧。可以从中访问属性 f_locals 来获得局部变量

方法二: 实现功能的还有一种方法,就是模板字符串,但是教之format_map var 就low一些了,,也是没法处理变量缺失问题使用 format() 方法还有一个好处就是你可以获得对字符串格式化的所有支持(对齐,填充,数字格式化等待)

import string
n=24
s = string.Template('$name has $n messages.')
print(s.substitute(vars()))   # zxc has 24 messages.
 
原文地址:https://www.cnblogs.com/zzy-9318/p/10451934.html