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

aid*_*ald 12 python python-3.x 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'
Run Code Online (Sandbox Code Playgroud)

我想重载接收'%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
        )
Run Code Online (Sandbox Code Playgroud)

Jim*_*ard 13

是的,但通过使用__format__,而不是__fstr__.


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

从引入它们的PEP 0498开始,代码等效:

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

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

一旦评估了格式说明符中的表达式(如果需要),f-string计算器就不会解释格式说明符.就像在str.format(),它们只是被传递给__format__()被格式化的对象的方法.

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

正如文档中__format__所描述的那样:

format()内置函数调用,并通过扩展,评估格式化的字符串文字str.format()方法,以生成对象的"格式化"字符串表示.