2

どうやら、Pythonは許可します

'%s %(var)s' % {'var': 'x'}

生産する

"{'var': 'x'} x"

基本的に、python の名前付きプレースホルダー置換機能のみが必要な場合に何かを書いています。名前付きプレースホルダーと位置プレースホルダーの組み合わせを検出する方法はありますか?

編集:これの文脈は、私が一種のテンプレートツールである何かを書いているということです。あちこちに %(named)s を使って大量のものを書き込んだ後、 template.substitute(dict) を呼び出してすべてを置き換えます。%[srfd,etc]文字列が残っている場合はエラーをスローすることで、文字列に残っている場合(補間などを忘れたため)を防止しようとしています。

4

3 に答える 3

4

str.__mod__組み込み関数は再プログラム可能ではありません。一部の機能を選択的にオフにする方法はありません。

ただし、正規表現を使用して位置プレースホルダーを見つけ、文字列補間の前にエスケープすることができます。

>>> d = {'var': 'x'}
>>> template = '%s %(var)s'
>>> esc_template = re.sub(r'(%[^()]*[sdf])', r'%\1', template)
>>> esc_template % d
'%s x'
于 2012-01-09T23:01:23.817 に答える
2

レイモンド・ヘッティンガーがそれがどのように行われたかを教えてくれたら、彼は正しいので聞いてください:)

もう 1 つのオプションは、サブクラス化string.Templateして、独自の置換ロジックと構文を定義することです。

于 2012-01-09T23:08:29.770 に答える
2

即時修正オプションではありませんが、agander のコメントを拡張するために、使用str.formatすると、エラーを表示せずに名前のないプレースホルダーを誤って入力しないことが少なくとも保証されます。これは、適切なメソッド呼び出し構文を使用して、名前付き置換から位置置換を分離するためです。

>>> '%s %(var)s' % {'var': 'x'}
"{'var': 'x'} x"
>>> '{} {var}'.format(var='x')

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    '{} {var}'.format(var='x')
IndexError: tuple index out of range
>>> '{} {var}'.format(8, var='x')
'8 x'

Python が2 つの異なる置換構文をサポートすることには、私が頻繁に使用する副次的な利点がありますが、これはちょっとした機能の乱用です。パラメータ化されたクエリのプレースホルダーを使用する DB インターフェースに渡す SQL クエリをアセンブルするコードをたくさん書いているので、%sすべての外部レベルのクエリの貼り付けを で行いstr.formatます%s

>>> '%s {var}'.format(var='x')
'%s x'

%sそれが、出力で渡されると予想される s を持っている理由である場合str.format、人生を大幅に簡素化できます。

于 2012-01-09T23:21:26.033 に答える