2017-10-11 10 views
1

format()メソッドは素晴らしいですが、{}を自分の文字列でエスケープしたいので、私の選択の識別子を変更したいと思います。str.format()内の識別子として中括弧を変更する


'Hi {name}'.format(**{'name': 'Alok'})私は{{}}を使用してそれらをエスケープする必要がありますので{}は私の文字列の一部である第二の例では'Hi {foo, bar}'

を出力します'Hi Alok'

'Hi {{{name1}, {name2}}}'.format(**{'name1':'foo', 'name2':'bar'})
を印刷します。

私は{}をエスケープしたくないですか、jinjaなどのようなテンプレートエンジンを使いたいと思っていません。どうすれば識別子を変更できますか?私はそこにサブクラスstrクラスを使用する方法があると思います。

+1

「私はエスケープしたくないとしよう。そして、そして」あなたは何をしたいですか?この質問は非常に幅広いです。 –

+0

'' 'サブクラス化クラスstrクラスを使用する方法があると思います。' ' - これは悪いです。 –

答えて

-1

あなたは使用することができますしかし、ルールはよりシンプルであり、あなたは、アライメントのような高度な書式設定機能を失う代わりに

{..}の$ベースの置換を行うString Templates

ドキュメント:string.Template

>>> from string import Template 
>>> s = Template('$who likes $what') 
>>> s.substitute(who='tim', what='kung pao') 
'tim likes kung pao' 
0

確かにあなたはおそらくstrのクラスをサブクラス化することができますが、私はこのagaintをお勧めします。これはどのように表示されるかの例です:

# -*- coding: utf-8 -*- 

class FormattableString(str): 
    def format(self, symbols, *args, **kwargs): 
     start, end = symbols 
     prepared_string = self.replace(
      start, '{').replace(end, '}') 

     return prepared_string.format(
      *args, **kwargs) 

if __name__ == '__main__': 
    f_string = FormattableString('Hello [name]') 
    print(f_string.format(('[', ']'), name='john')) 

古いスタイルの文字列書式も使用できます。ここ

'Hi {%(name1)s, %(name2)s}' % {'name1':'foo', 'name2':'bar'} 

は、2つの方法が比較されているリンクです https://pyformat.info/

私は多分、古いスタイルを使用して、新しいスタイルの混乱可能性としてではなく場合は、文字列を、古いスタイルを避け推薦

は、その特定のためのより良いです使用事例。

+0

この解決策は、依然として{{'と'} 'を代入に使用しているので私の目的を解決しません。 '{'、'}'をエスケープしないと動作しません。 –

+0

本当に私はその部分を逃しました。同じ方法でエスケープを追加することはできますか? –

関連する問題