Мы хотим автоматически применять функцию к определенным строкам. Функцию следует применять лениво (т. е. когда строка используется/читается). В нашем случае это перевод с помощью gettext, но это может быть любая функция.
Подобные классы существуют, например. в py-babel LazyProx.
Мы используем встроенную в Python UserString для применения функции следующим образом:
Код: Выделить всё
class LazyString(UserString):
def __init__(self, original_str: str):
self.original_str = original_str
@property
def data(self) -> str:
return our_func(self.original_str)
- Средство записи файлов по умолчанию выполняет вызов isinstance(...,str) перед записью строки.
- json.dumps не принимает UserString в качестве ключей (даже если это просто str)
- pydantic очень... педантичен в отношении типов, о которых он предупреждает в UserString, где str ожидается, но также терпит неудачу при сериализации и дампе модели.
Мы также не можем наследовать от str, потому что это обходит нашу ленивую функцию и просто возвращает строку. Итак, вопрос в том, есть ли способ перехватить доступ к self в строке или есть ли способ заставить UserString приниматься как str (поскольку он равен во всех практических терминах)?
Edit/Addition
Во время исследования мы обнаружили еще две связанные темы.
https://github.com/python/typeshed/issues/5957 объясняет почему типизация UserString и str различна и почему потребовалось бы много усилий, чтобы сделать их равными (т. е. в соответствии с типом StringLike).
https://github.com/django/django/blob/a ... __.py#L111 показывает, как Django решает проблему, хотя в результате получается выделенный класс, а не строка вообще
Мобильная версия