2017-09-11 14 views
11

私はPythonの辞書のように見える文字列でformatを使用して問題を抱えています。私はそれをしようとした場合{"one":1} として:私は次の文字列を生成したいなぜ、この文字列を書式設定時に辞書として解釈するのですか?

インタプリタはKeyError例外をスロー

'{"one":{}}'.format(1) 

>>> a = '{"one":{}}'.format(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: '"one"' 

私は、問題はおそらく周りを公転することを理解し文字列がformat{}と混同することができ{が、含まれているという事実。なぜこれは正確に起こり、どのように解決できるのでしょうか?

私は、パーセントの書式を知っているが、私はformat()を捨てる必要としない解決策を見つけるしたいと思います。

+0

パーセントのフォーマットよりも心に留めておいてくださいは速いです:timeit.timeit 'の形式= 0.7228269569986878、%= 0.03355357599866693(結果'あなたの例で) –

+0

@ YaroslavSurzhikov膨大な量の文字列を生成しているのでなければ、それは本当に重要だとは思わない。 – JAB

+0

辞書の文字列を作成する場合は、 'str({" one ":1})'を考慮してください。 – marcelm

答えて

15

'{"one": {}}'の書式設定はusing an identifier as the field_nameであり、基本的に.formatに指定されたキーワード引数を検索しようとします。名前は'"one"'です。ドキュメントの状態として

The field_name itself begins with an arg_name that is either a number or a keyword. If it’s a number, it refers to a positional argument, and if it’s a keyword, it refers to a named keyword argument.

(強調鉱山)あなたがKeyError例外を取得する理由です

formatに提供されたキーワード引数のマッピングでキーを検索しようとします。 (この場合は空です。したがってエラーです)。解決策として

、ちょうど外側の中括弧をエスケープ:

>>> '{{"one":{}}}'.format(1) 
'{"one":1}' 

あなたが将来的にf -stringsを使用して決定した場合、同じ救済策が適用されます:あなたが必要

>>> f'{{"one": {1}}}' 
'{"one": 1}' 
+1

ああ!私はエスケープが問題であることを知っていましたが、二重中括弧ではなくエスケープするために '\'を使用していました。ありがとう! – user2891462

11

は、中括弧を倍増文字列フォーマットで中括弧をエスケープする{{}}docから

a= '{{"one":{}}}'.format(1) 

:あなたは括弧をエスケープしていない場合は

Format strings contain “replacement fields” surrounded by curly braces {} . Anything that is not contained in braces is considered literal text, which is copied unchanged to the output. If you need to include a brace character in the literal text, it can be escaped by doubling: {{ and }}.

str.format()は、文字列をフォーマットするキー'"one"'の値を探します。たとえば:

b = '{"one"} foo'.format(**{'"one"':1}) 
print(b) # 1 foo 
1

中括弧は、使用をダブル括弧を使用してエスケープすることができます。

'{{"one":{}}}'.format(1) 
関連する問題