строковый формат Python suppress / silent keyerror / indexerror [ duplicate]

Есть ли способ использовать 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 ""

Это похоже на обеспечить желаемое поведение.

16
задан Code freak 21 August 2010 в 05:36
поделиться

2 ответа

К сожалению, нет, по умолчанию такой возможности нет. Однако вы можете предоставить ему 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
5
ответ дан 30 November 2019 в 16:30
поделиться

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

18
ответ дан 30 November 2019 в 16:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: