问题 你可以重载Python 3.6 f-string的“运算符”吗?


在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
        )

5035
2017-11-02 17:42


起源

这是我之前准备的。 - wim
为了更灵活,您可以覆盖在中提供的方法 string.Formatter 类 - 如 get_field, get_value, check_unused_args, format_field,和 convert_field  - 获得更详细的控制权 format 功能行为。 - Rick Teachey


答案:


,但通过使用 __format__不是 __fstr__


f-strings不是以前格式化字符串的方法的改革。相反,它建立在已有的协议之上。

PEP 0498 介绍他们,在 代码等价

未指定用于实现f字符串的确切代码。但是,保证转换为字符串的任何嵌入值都将使用该值 __format__ 方法。这是同样的机制 str.format() 用于将值转换为字符串。

再一次,在 格式说明符

一旦评估了格式说明符中的表达式(如果需要),f-string赋值器就不会解释格式说明符。就像在 str.format(),他们只是传入了 __format__() 正在格式化的对象的方法。

所以,没有  他们的特殊方法。你需要定义一个 __format__ 获取规范并返回格式正确的字符串的方法。

作为文档 __format__ 还描述:

叫做 format() 内置功能,并通过扩展, 评估格式化的字符串文字 和 str.format() 方法,用于生成对象的“格式化”字符串表示。


12
2017-11-02 18:01



细节 - docs.python.org/3/reference/datamodel.html#object.__format__ - aidan.plenert.macdonald