现在我有一个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 d
传递给format
使用val.format(** d),它应该可以工作。但是,当字数大得多时,它可能会贵得多。
====编辑====
谢谢你user2357112 - 你说的是对的。我没想到这样。实际上format
做的是搜索那里提到的密钥并调用dict.get()
并在kwargs是feed时替换。为了调用一个函数,我打算对参数执行一个动作是多么明亮,而动作已经由函数本身实现....
答案 0 :(得分: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'