2013-09-17 2 views
-2

Теперь у меня есть 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 (** г). Но это может быть намного дороже, когда дикт намного больше.

==== ==== редактировать

спасибо user2357112 - то, что вы говорите правильно. Я так не думал. на самом деле то, что format сделать, - это поиск ключей, упомянутых здесь, и вызов dict.get() и замена при подаче kwargs. Как ярко я должен был выполнить действие по параметрам, чтобы вызвать функцию, а действие уже реализовано самой функцией ....

+1

Это довольно запутанным вопрос, в основном потому, что вы сделали плохую работу именования переменных. –

+0

Зачем вам это нужно в форме строки формата? Что не так, просто имея значение, предоставленное пользователем, '' key2''? – user2357112

+2

Почему это было бы дороже, если бы диктофон был больше? 'str.format' не нужно читать весь dict. Он просто использует части, упомянутые в строке формата. – user2357112

ответ

1

Если у вас есть список возможных строк, доступных для подстановки в runtime, это все, что вам нужно. Если у вас есть отображение словаря между доступными ключевыми словами и их предопределенных значениями - назовет это available_fruit --the проблемы становится легко:

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' 
Смежные вопросы