在阅读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)
self
假定为*args
中的第一个arg
,并在此行中展开:self, *args = args
在签名中声明一个没有self的实例方法在Python中是不常见的。你知道吗
通过查看方法签名行的git history,我们可以看到最初的
self
是存在的。你知道吗它已被删除,因为如果格式字符串包含名为
self
的变量(例如'I am my{self}'
),则它的存在会导致错误。引入了从args
解包self
的不寻常模式来修复这个bug。你知道吗错误报告和讨论是here。你知道吗
这是错误报告中的错误示例:
我假设您熟悉参数中的
*args
语法。这只是一个未命名参数的任意列表。那你有这个评论非常明确。您正在将
args
(这是一个列表)拆分为第一个元素(我们通常称之为self
,但它只是一个常规参数,始终是对象方法中的第一个)和其他元素。因此,我们阅读self
,一切都很好-不是立即的,而是在函数中。你知道吗我在这里看到的唯一用例是
这意味着我们要做的事情
很多(不知道为什么,比如工厂?),所以在我的示例中,如果我们忘记发送
self
-formatterObj
,我们会得到一个详细的错误。可能支持类似Formatter
的对象,这些对象没有format
方法,但是有vformat
方法。但似乎不大可能。你知道吗相关问题 更多 >
编程相关推荐