为什么不呢string.Formatter.format格式有“self”参数吗?

2024-03-29 08:56:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在阅读python的string模块的源代码时,我被类Formatter搞糊涂了。你知道吗

格式化程序类中的format方法(不是静态方法,也不是类方法)没有self作为输入参数def format(*args, **kwargs):,而是直接在方法中使用它。self, *args = args。你知道吗

请解释一下这个用法。你知道吗

class Formatter:
    def format(*args, **kwargs):
        if not args:
            raise TypeError("descriptor 'format' of 'Formatter' object "
                            "needs an argument")
        self, *args = args  # allow the "self" keyword be passed
        try:
            format_string, *args = args # allow the "format_string" keyword be passed
        except ValueError:
            if 'format_string' in kwargs:
                ...
            else:
                ...
        return self.vformat(format_string, args, kwargs)

Tags: 模块the方法selfformatstringifformatter
2条回答

self假定为*args中的第一个arg,并在此行中展开:

self, *args = args

在签名中声明一个没有self的实例方法在Python中是不常见的。你知道吗

通过查看方法签名行的git history,我们可以看到最初的self是存在的。你知道吗

它已被删除,因为如果格式字符串包含名为self的变量(例如'I am my{self}'),则它的存在会导致错误。引入了从args解包self的不寻常模式来修复这个bug。你知道吗

错误报告和讨论是here。你知道吗

这是错误报告中的错误示例:

>>> string.Formatter().format('the self is {self}', self='bozo')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: format() got multiple values for argument 'self'

我假设您熟悉参数中的*args语法。这只是一个未命名参数的任意列表。那你有

self, *args = args  # allow the "self" keyword be passed

这个评论非常明确。您正在将args(这是一个列表)拆分为第一个元素(我们通常称之为self,但它只是一个常规参数,始终是对象方法中的第一个)和其他元素。因此,我们阅读self,一切都很好-不是立即的,而是在函数中。你知道吗

我在这里看到的唯一用例是

if not args:
        raise TypeError("descriptor 'format' of 'Formatter' object "
                        "needs an argument")

这意味着我们要做的事情

Formatter.format(formatterObj,format_string,...)

很多(不知道为什么,比如工厂?),所以在我的示例中,如果我们忘记发送self-formatterObj,我们会得到一个详细的错误。可能支持类似Formatter的对象,这些对象没有format方法,但是有vformat方法。但似乎不大可能。你知道吗

相关问题 更多 >