【问题标题】:Can you overload the Python 3.6 f-string's "operator"?你能重载 Python 3.6 f-string 的“操作符”吗?
【发布时间】:2018-04-15 08:16:05
【问题描述】:

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

【问题讨论】:

  • 为了获得更大的灵活性,您可以覆盖 string.Formatter class 中提供的方法 - 例如 get_fieldget_valuecheck_unused_argsformat_fieldconvert_field - 以对format 函数行为进行更详细的控制。

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


【解决方案1】:

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


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

来自介绍他们的PEP 0498Code equivalence

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

然后再一次,在Format Specifiers:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 2011-04-30
    • 2019-01-23
    • 2015-12-17
    • 2021-05-16
    • 2021-10-04
    • 2021-03-25
    相关资源
    最近更新 更多