2016-09-23 85 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