zoukankan      html  css  js  c++  java
  • 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.
     
  • 相关阅读:
    如何查看linux端口被哪个进程占用
    Beego 结合 GORM 操作 Mysql 数据库
    Linux Go proxy 设置
    working directory is not part of a module
    依赖注入 gin项目的目录结构说明
    详解django中使用定时任务的方法
    input 原声上传文件 file转化为binary对象发送给后台
    vue篇之事件总线(EventBus)
    小程序路由遇到的问题(eventChannel.emit is not a function报错)
    小程序组件(弹窗组件以及插槽使用)
  • 原文地址:https://www.cnblogs.com/zzy-9318/p/10451934.html
Copyright © 2011-2022 走看看