12

印刷したいキーにコロンがある辞書があります。残念ながら、コロン文字は書式設定に使用されるため、何らかの方法でエスケープする必要があります。

例えば:

>>> d = {'hello': 'world', 'with:colon': 'moo'}

>>> '{hello}'.format(**d)
'world'

>>> '{with:colon}'.format(**d)
KeyError: 'with'

>>> '{with\:colon}'.format(**d)
KeyError: 'with\\'

>>> '{with::colon}'.format(**d)
KeyError: 'with'
4

6 に答える 6

10

documentationによると、あなたが求めていることは単に不可能です。具体的には、

arg_name は引用符で区切られていないため、フォーマット文字列内で任意の辞書キー (文字列'10'やなど) を指定することはできません。':-]'

于 2013-11-11T18:47:27.420 に答える
6

回避策として:

>>> d = {'hello': 'world', 'with:colon': 'moo'}
>>> '{hello} {}'.format(d['with:colon'],**d)
'world moo'
>>> '{hello} {0}'.format(d['with:colon'],**d)
'world moo'
于 2013-11-11T18:56:37.863 に答える
2

できません - キーは Python 識別子と構文的に同等でなければなりません。ドキュメントのフォーマット文字列の構文を参照してください。

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name          ::=  [identifier | integer]
attribute_name    ::=  identifier
于 2013-11-11T18:47:50.020 に答える
1

@ murgatroid99が彼の回答で指摘しているように、これは不可能です。

回避策は、キーを有効なキーに置き換えることです。

d_sanitised = {key.replace(":", "-"): value for key, value in d.items()}

当然、他のキーと競合する可能性がある場合は注意が必要です。

>>> d = {'hello': 'world', 'with:colon': 'moo'}
>>> d_sanitised = {key.replace(":", "-"): value for key, value in d.items()}
>>> '{with-colon}'.format(**d_sanitised)
'moo'

明らかに、これはフォーマット文字列を適切に変更できることを前提としています。理想的には、コロンが一緒にならないように両端を変更するだけです。

于 2013-11-11T18:50:44.187 に答える