15

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

1 回答 1

14

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


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

来自介绍它们的PEP 0498,在Code equivalence中:

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

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

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

所以,他们没有的特殊方法。您需要定义一个__format__采用规范并返回适当格式的字符串的方法。

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

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

于 2017-11-02T18:01:30.657 回答