Можете ли вы перегрузить "-оператор" f-string Python 3.6?

В Python 3.6 вы можете использовать f-строки, например:

>>> date = datetime.date(1991, 10, 12)
>>> f'{date} was on a {date:%A}'
'1991-10-12 was on a Saturday'

Я хочу перегрузить метод, получающий '%A' выше. Это можно сделать?

Например, если бы я хотел написать немой обертку вокруг datetime, я мог бы ожидать, что эта перегрузка будет выглядеть примерно так:

class MyDatetime:
    def __init__(self, my_datetime, some_other_value):
        self.dt = my_datetime
        self.some_other_value = some_other_value

    def __fstr__(self, format_str):
        return (
            self.dt.strftime(format_str) + 
            'some other string' +
            str(self.some_other_value
        )

Ответ 1

Да, но используя __format__, а не __fstr__.


f -строки не были перестройкой предыдущих методов форматирования строк. Вместо этого он построен на уже существующих протоколах.

Из PEP 0498, который представил их в Обоснование кода:

Точный код, используемый для реализации f-строк, не указан. Тем не менее, гарантируется, что любое встроенное значение, которое преобразуется в строку, будет использовать это значение __format__. Это тот же механизм, который str.format() использует для преобразования значений в строки.

а затем снова в Спецификаторы формата:

Как только выражения в спецификаторе формата оцениваются (если необходимо), спецификаторы формата не интерпретируются f-string-оценщиком. Как и в str.format(), они просто передаются методу __format__() объекта, отформатированного.

Итак, для них нет специального специального метода. Вам нужно определить метод __format__, который принимает спецификацию и возвращает соответствующую форматированную строку.

В документах __format__ также описываются:

Вызывается встроенной функцией format() и расширением, оценивая форматированные строковые литералы и метод str.format(), чтобы создать "форматированное" строковое представление объекта.