Я хочу молча игнорировать ошибки KeyError и вместо этого заменять их заполнителями, если значения не найдены. Например:
class Name:
def __init__(self, name):
self.name = name
self.capitalized = name.capitalize()
def __str__(self):
return self.name
"hello, {name}!".format(name=Name("bob")) # hello, bob!
"greetings, {name.capitalized}!".format(name=Name("bob")) # greetings, Bob!
# but, if no name kwarg is given...
"hello, {name}!".format(age=34) # hello, {name}!
"greetings, {name.capitalized}!".format(age=34) # greetings, {name.capitalized}!
Моя цель — создать собственный пакет локализации для личных проектов (мне не удалось найти существующие пакеты, которые делали бы все, что я хотел). Сообщения могут быть настраиваемы пользователем, но я хочу, чтобы пользователи работали безупречно, поэтому, например, если они допустят опечатку и вставят {nmae вместо {name}, я не хочу пользователям приходится иметь дело с ошибками, но вместо этого я хочу сообщить им, что они допустили опечатку, указав им значение-заполнитель.
Я нашел несколько решений в stackoverflow, но ни одно из них может обрабатывать атрибуты. Мое первое решение было таким:
class Default(dict):
"""A dictionary that returns the key itself wrapped in curly braces if the key is not found."""
def __missing__(self, key: str) -> str:
return f"{{{key}}}"
Но это приводит к ошибке при попытке использовать его с атрибутами: AttributeError: у объекта 'str' нет атрибута, написанного с заглавной буквы, он печатает "hello, {name" }!" без проблем. То же самое касается моего второго решения с использованием string.Formatter:
class CustomFormatter(string.Formatter):
def get_value(self, key, args, kwargs):
try:
value = super().get_value(key, args, kwargs)
except KeyError:
value = f'{{{key}}}'
except AttributeError:
value = f'{{{key}}}'
return value
formatter.format("hello, {name}!", name=Name("bob")) # hello, bob!
formatter.format("greetings, {name.capitalized}!", name=Name("bob")) # greetings, Bob!
formatter.format("hello, {name}!", age=42) # hello, {name}!
formatter.format("greetings, {name.capitalized}!", age=42) # AttributeError: 'str' object has no attribute 'capitalized'
Так как же я мог добиться чего-то подобного?
"hello, {name}!".format(name=Name("bob")) # hello, bob!
"greetings, {name.capitalized}!".format(name=Name("bob")) # greetings, Bob!
# but, if no name kwarg is given...
"hello, {name}!".format(age=34) # hello, {name}!
"greetings, {name.capitalized}!".format(age=34) # greetings, {name.capitalized}!
Подробнее здесь: https://stackoverflow.com/questions/793 ... -not-found
Возвращать значения заполнителей с форматированием, если ключ не найден ⇐ Python
Программы на Python
1735589179
Anonymous
Я хочу молча игнорировать ошибки KeyError и вместо этого заменять их заполнителями, если значения не найдены. Например:
class Name:
def __init__(self, name):
self.name = name
self.capitalized = name.capitalize()
def __str__(self):
return self.name
"hello, {name}!".format(name=Name("bob")) # hello, bob!
"greetings, {name.capitalized}!".format(name=Name("bob")) # greetings, Bob!
# but, if no name kwarg is given...
"hello, {name}!".format(age=34) # hello, {name}!
"greetings, {name.capitalized}!".format(age=34) # greetings, {name.capitalized}!
Моя цель — создать собственный пакет локализации для личных проектов (мне не удалось найти существующие пакеты, которые делали бы все, что я хотел). Сообщения могут быть настраиваемы пользователем, но я хочу, чтобы пользователи работали безупречно, поэтому, например, если они допустят опечатку и вставят {nmae вместо {name}, я не хочу пользователям приходится иметь дело с ошибками, но вместо этого я хочу сообщить им, что они допустили опечатку, указав им значение-заполнитель.
Я нашел несколько решений в stackoverflow, но ни одно из них может обрабатывать атрибуты. Мое первое решение было таким:
class Default(dict):
"""A dictionary that returns the key itself wrapped in curly braces if the key is not found."""
def __missing__(self, key: str) -> str:
return f"{{{key}}}"
Но это приводит к ошибке при попытке использовать его с атрибутами: AttributeError: у объекта 'str' нет атрибута, написанного с заглавной буквы, он печатает "hello, {name" }!" без проблем. То же самое касается моего второго решения с использованием string.Formatter:
class CustomFormatter(string.Formatter):
def get_value(self, key, args, kwargs):
try:
value = super().get_value(key, args, kwargs)
except KeyError:
value = f'{{{key}}}'
except AttributeError:
value = f'{{{key}}}'
return value
formatter.format("hello, {name}!", name=Name("bob")) # hello, bob!
formatter.format("greetings, {name.capitalized}!", name=Name("bob")) # greetings, Bob!
formatter.format("hello, {name}!", age=42) # hello, {name}!
formatter.format("greetings, {name.capitalized}!", age=42) # AttributeError: 'str' object has no attribute 'capitalized'
Так как же я мог добиться чего-то подобного?
"hello, {name}!".format(name=Name("bob")) # hello, bob!
"greetings, {name.capitalized}!".format(name=Name("bob")) # greetings, Bob!
# but, if no name kwarg is given...
"hello, {name}!".format(age=34) # hello, {name}!
"greetings, {name.capitalized}!".format(age=34) # greetings, {name.capitalized}!
Подробнее здесь: [url]https://stackoverflow.com/questions/79318200/return-placeholder-values-with-formatting-if-a-key-is-not-found[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия