zoukankan      html  css  js  c++  java
  • 【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}
    >>> 
  • 相关阅读:
    商战
    广告、好广告
    车的一点知识
    微服务应用的性能
    js 的一点用法
    做生意、做买卖
    [CODEVS1912] 汽车加油行驶问题(分层图最短路)
    [CODEVS1911] 孤岛营救问题(分层图最短路)
    [luoguP2754] 星际转移问题(最大流)
    [POJ1226]Substrings(后缀数组)
  • 原文地址:https://www.cnblogs.com/apple2016/p/5793659.html
Copyright © 2011-2022 走看看