Есть ли способ использовать python string.format, чтобы вместо этого при отсутствии индекса не генерировалось исключение вставлена пустая строка.
result = "i am an {error} example string {error2}".format(hello=2,error2="success")
здесь результат должен быть:
"i am an example string success"
Прямо сейчас python выдает ошибку ключа и прекращает форматирование. Можно ли изменить это поведение?
Спасибо
Изменить:
Там существует Template.safe_substitute (даже если шаблон остается неизменным, а не вставляется пустая строка), но не может ничего подобного для string.format
Желаемое поведение было бы похоже на подстановку строк в php.
class Formatter(string.Formatter):
def get_value(self,key,args,kwargs):
try:
if hasattr(key,"__mod__"):
return args[key]
else:
return kwargs[key]
except:
return ""
Это похоже на обеспечить желаемое поведение.
К сожалению, нет, по умолчанию такой возможности нет. Однако вы можете предоставить ему defaultdict или объект с переопределенным __ getattr __
и использовать его так:
class SafeFormat(object):
def __init__(self, **kw):
self.__dict = kw
def __getattr__(self, name):
if not name.startswith('__'):
return self.__dict.get(name, '')
print "i am an {0.error} example string {0.error2}".format(SafeFormat(hello=2,error2="success"))
i am an example string success
str.format ()
не ожидает отображения объекта. Попробуйте следующее:
from collections import defaultdict
d = defaultdict(str)
d['error2'] = "success"
s = "i am an {0[error]} example string {0[error2]}"
print s.format(d)
Вы делаете defaultdict с фабрикой str ()
, которая возвращает "". Затем вы делаете один ключ для defaultdict. В строке формата вы получаете доступ к ключам первого переданного объекта. Это имеет то преимущество, что позволяет вам передавать другие ключи и значения, если ваш defaultdict является первым аргументом функции format ()
.
Также см. http://bugs.python.org/issue6081