Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么';t string.Formatter.format有一个;“自我”;参数_Python_String_Class_Self - Fatal编程技术网

Python 为什么';t string.Formatter.format有一个;“自我”;参数

Python 为什么';t string.Formatter.format有一个;“自我”;参数,python,string,class,self,Python,String,Class,Self,在阅读python的string模块的源代码时,我被类格式化程序搞糊涂了 格式化程序类中的format方法(非静态或类方法)没有将self作为输入参数def format(*args,**kwargs):,但在方法中直接使用它自身,*args=args 请解释一下这个用法 class Formatter: def format(*args, **kwargs): if not args: raise TypeError("descriptor 'f

在阅读python的
string
模块的源代码时,我被类
格式化程序
搞糊涂了

格式化程序类中的
format
方法(非静态或类方法)没有将
self
作为输入参数
def format(*args,**kwargs):
,但在方法中直接使用它<代码>自身,*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中是不常见的

通过查看签名行的方法,我们可以看到原来的
self
存在

如果格式字符串包含名为
self
的变量,例如
'I am my{self}'
,则会导致错误,因此已将其删除。引入了从
args
解包
self
的异常模式来修复该错误

错误报告和讨论正在进行中

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

>>> 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'
>string.Formatter().format('self是{self}',self='bozo')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:format()为参数“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
方法。似乎不太可能。self不是一个关键词,它是一个惯例使用的名称:@UnholySheep,谢谢。这回答了什么。。。但是为什么呢?
self
引用始终是传递到类方法中的第一个参数,因此,如果您可以为self创建一个参数,为什么还要在方法内部使用元组解包将其从位置参数中分离出来呢?@snakecharmerb,谢谢。通过查看git历史,可以获得良好的技术。