これで、キーが次のような dict オブジェクトがあります。
d ={}
d['fruit'] = 'apple' # user input from a configuration file
d['availablefruit'] = 'orange' # generated by the program
私の願いは、ユーザーがd['fruit']='{availablefruit:s}'
プログラムによって生成された値を利用するためにorange
、nestget
関数によって設定できることです。
d['fruit'] = '{availablefruit:s}' # from user input
print d.nestget('fruit', None) # return orange is applicable
これを行う理由は、いくつかの「自動入力」機能を実現するためです。つまり、ユーザーは、「果物」の事前に指定された値 (例: ) を取得するか、どの果物が利用可能かを知らなくてもapple
キーからマシンが生成した値を使用できます。availablefruit
関数nestget
が呼び出されるまでに。
ここに問題があります:文字列のメソッドを実行できるように、文字列に埋め込まれているgetformatstringkeys
ものを返すような素敵な関数はありますか?availablefruit
{availablefruit:s}
format
def nestget(key, default):
val = d.get(key, default)
keys_in_val = getformatstringkeys(val)
return val.format(**{k:d[k] for k in keys_in_val})
私がテストすると、次の
'{a:f},{b:f},{c:f}'.format(a=1,b=2,c=3,d=4,e=5)
を与える'1,2,3'
ので、dict全体を渡してval.format(**d)d
を使用するとうまくいくはずです。format
しかし、口述がはるかに大きい場合、それははるかに高価になる可能性があります。
==== 編集 ====
user2357112 に感謝します -- あなたの言っていることは正しいです。私はこのように考えていませんでした。実際にformat
行うことは、そこに記載されているキーを検索し、dict.get()
kwargs がフィードのときに呼び出して置き換えることです。関数を呼び出すためにパラメーターに対してアクションを実行するつもりだったのに、そのアクションは関数自体によって既に実装されています....