-2

これで、キーが次のような dict オブジェクトがあります。

d ={}
d['fruit'] = 'apple'   # user input from a configuration file
d['availablefruit'] = 'orange'  # generated by the program

私の願いは、ユーザーがd['fruit']='{availablefruit:s}'プログラムによって生成された値を利用するためにorangenestget関数によって設定できることです。

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 がフィードのときに呼び出して置き換えることです。関数を呼び出すためにパラメーターに対してアクションを実行するつもりだったのに、そのアクションは関数自体によって既に実装されています....

4

1 に答える 1

1

実行時に置換可能な文字列のリストがあれば、それで十分です。利用可能なキーワードと事前に定義された値の間の辞書マッピングがあると仮定すると、available_fruit問題は簡単になります。

available_fruit = {'fruit1':'orange', 'fruit2':'banana'}
def get_format_string_keys(val):
    results = []
    for k, v in available_fruit.iteritems():
        if k in val:
            results.append((k,v))
    return results

これにより、次のことがわかります。

>>> test_string = 'fruit1 is my favorite fruit'
>>> results = get_format_string_keys(test_string)
>>> for r in results:
...    print r
...
('fruit1', 'orange') 

これに基づいて、nestget関数内で簡単に次のことができます。

>>> for r in results:
...    test_string.replace(*r)
...
'orange is my favorite fruit'
于 2013-09-17T04:42:49.007 に答える