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

16
在Python 3.6中,您可以使用类似于f-strings的方式:
>>> 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
这是我之前准备好的一个例子:https://gist.github.com/wimglenn/3186645d0474550160d3210bf488f8f8。 - wim
2
为了获得更多的灵活性,您可以覆盖string.Formatter中提供的方法,例如get_fieldget_valuecheck_unused_argsformat_fieldconvert_field,以获得对format函数行为的更详细控制。 - Rick
1个回答

14

是的,但使用的是__format__而不是__fstr__


f-strings并非对之前格式化字符串方法的全面改革,而是在已有协议基础上构建。

在介绍f-strings的PEP 0498中,在代码等价性中写道:

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

然后,再次在格式说明符中写道:

一旦评估了格式说明符中的表达式(如果必要),则格式说明符将不会由f-string求值器解释。就像在str.format()中一样,它们仅被传递到正在格式化的对象的__format__()方法中。

因此,它们没有新的特殊方法。您需要定义一个__format__方法,该方法接受规范并返回适当格式的字符串。

正如__format__文档所述:

format()内置函数调用,并通过扩展格式化字符串字面值的求值str.format()方法来生成对象的“格式化”字符串表示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接