Возвращать значения заполнителей с форматированием, если ключ не найденPython

Программы на Python
Ответить
Anonymous
 Возвращать значения заполнителей с форматированием, если ключ не найден

Сообщение 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}!


Подробнее здесь: https://stackoverflow.com/questions/793 ... -not-found
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»