你可以重载Python 3.6 f-string' s"运算符"?

时间:2017-11-02 17:42:02

标签: python python-3.x python-3.6 f-string

在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 个答案:

答案 0 :(得分:13)

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

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

引自他们的PEP 0498Code equivalence

  

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

然后再次在Format Specifiers

  

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

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

正如__format__上的文档也描述:

  

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