25

洗練された解決策を思いつくことができない、かなり単純な問題に遭遇しました。

フォーマットに使用する置換でstr.format渡される関数を使用して文字列を作成しています。dict文字列を作成し、値が渡された場合は値でフォーマットし、それ以外の場合は空白のままにします。

kwargs = {"name": "mark"}
"My name is {name} and I'm really {adjective}.".format(**kwargs)

戻るべき

"My name is mark and I'm really ."

を投げる代わりにKeyError(何もしないとこうなります)。

恥ずかしいことに、私はこの問題に対する洗練されていない解決策さえ思いつきません。を使用しないだけでこれを解決できるstr.formatと思いますが、可能であれば、組み込み (ほとんどの場合、私が望むことを行います) を使用したいと思います。

注: どのキーが使用されるかは事前にわかりません。誰かがキーを含んでいて、それを kwargs dict に入れていない場合、私は優雅に失敗しようとしています。どのキーが検索されるかが 100% の精度でわかっていれば、すべてのキーを入力して完了です。

4

8 に答える 8

28

PEP 3101の推奨に従って、サブクラス Formatter を使用できます。

import string

class BlankFormatter(string.Formatter):
    def __init__(self, default=''):
        self.default=default

    def get_value(self, key, args, kwds):
        if isinstance(key, str):
            return kwds.get(key, self.default)
        else:
            return string.Formatter.get_value(key, args, kwds)

kwargs = {"name": "mark", "adj": "mad"}     
fmt=BlankFormatter()
print fmt.format("My name is {name} and I'm really {adj}.", **kwargs)
# My name is mark and I'm really mad.
print fmt.format("My name is {name} and I'm really {adjective}.", **kwargs)
# My name is mark and I'm really .  

Python 3.2 以降では、代わりに.format_mapを使用できます。

class Default(dict):
    def __missing__(self, key):
        return '{'+key+'}'

kwargs = {"name": "mark"}

print("My name is {name} and I'm really {adjective}.".format_map(Default(kwargs)))

これは次を印刷します:

My name is mark and I'm really {adjective}.
于 2013-11-05T22:47:52.703 に答える
14

を使用する 1 つのオプションを次に示しますcollections.defaultdict

>>> from collections import defaultdict
>>> kwargs = {"name": "mark"}
>>> template = "My name is {0[name]} and I'm really {0[adjective]}."
>>> template.format(defaultdict(str, kwargs))
"My name is mark and I'm really ."

**辞書をキーワード引数にアンパックするために使用していないことに注意してください。フォーマット指定子は{0[name]}andを使用しています。これは、 andを使用{0[adjective]}する最初の引数でキー検索を実行する必要があることを示しています。不足しているキーを使用すると、KeyError が発生する代わりに空の文字列が返されます。format()"name""adjective"defaultdict

于 2013-11-05T21:52:45.447 に答える
-1

キー エラーを回避する方法は、dict に含めて空白のままにすることです。

kwargs = {"name": "mark", "adjective": ""}
"My name is {name} and I'm really {adjective}.".format(**kwargs)

キーワード引数は、それらが kwargs のキーであることを期待しています。それを行う別の方法は、位置引数です。

"My name is {0} and I'm really {1}.".format("mark")

「私の名前はマークです。私は本当です。」その間

"My name is {0} and I'm really {1}.".format("mark","black")

「私の名前はマークで、私は本当に黒人です。」

または、ValueError をキャッチすることもできます。

于 2013-11-05T21:51:13.017 に答える