2016-09-23 86 views
2

我想撰写并返回像"Hey {where}, {who}!" Python的模板字符串使用从片.format(),像Python标准函数在.format()之前转义字符串?

template = greeting_template + ", " + appeal_template + some_text 
return template 

some_text是涉及到从外部范围我的可变的,所以我不知道是否有任何特殊字符。 .format()的特殊字符是{}

当然,我可以做

some_text = some_text.replace("{", "{{").replace("}", "}}") 

然后用some_text模板,因为我喜欢。但是我觉得这是一个不好的解决方案,因为它没有考虑Python的更高版本中格式化语法的可能扩展。

那么,在使用.format()之前,是否有任何标准函数(或其他方式,如用于转义字符串的JavaScript的json.dumps)转义字符串?

+2

我不明白你的问题。 你可以发布你的代码与不好的解决方案吗? – Axnyff

+1

也许你应该重新考虑**将'some_text'合并到模板中。理想情况下,模板也应该有一个'some_text'的占位符,并在不再被视为模板的地方渲染它。 –

+0

我不担心支持可能永远不会发生的事情。无论即使有什么东西都不会涉及到在字符串栏中转义大括号,他们想要打破向后兼容性。 –

回答

2
some_text = '{brackets}' 
  1. 的OP的方法

some_text = some_text.replace("{", "{{").replace("}", "}}")

  • 正则表达式

  • 从Shadowranger上Format a string that has extra curly braces in it的Python 3.x的只有

  • unformatter = str.maketrans({'{': '{{', '}': '}}'})

    some_text = some_text.translate(unformatter)

    结果:{{brackets}}


    不知道如何抢占这些 “格式在Python的进一步版本的语法可能扩展”,所以现在它似乎逃脱curly brackets是你唯一的担忧。

    +0

    这是怎么逃脱任何东西? –

    +0

    啊我不好,以为他们不得不去。那么're.escape(some_text)'会更有意义。 – BrechtDeMan

    +0

    @Hevlastka,这与逃避大括号如何到底有什么关系? –

    -2

    您可以构建与处理复制大括号定制.format()模板:

    例如

    import string 
    
    class FormatterWithEscapedCurlyBrackets(string.Formatter): 
        def convert_field(self, value, conversion): 
         if conversion == 'e': 
          return value.replace('{', '{{').replace('}', '}}') 
         else: 
          return super(FormatterWithEscapedCurlyBrackets, self).convert_field(value, conversion) 
    
    fmt = FormatterWithEscapedCurlyBrackets().format 
    
    template = fmt("{greeting}, {appeal}{some_text!e}", greeting="Hey {where}", appeal="{who}", some_text="!{brackets}") 
    
    template.format(where="here", who="you") 
    # or 
    fmt(template, where="here", who="you") 
    
    +0

    我完全理解错误的问题。这是另一个自定义格式化程序的尝试。 – no73