Почему string.Formatter.format не имеет параметра "self"? - PullRequest
0 голосов
/ 26 декабря 2018

При чтении исходного кода модуля string в python меня смущает класс Formatter.

Метод format (не статический и не метод класса) в классе Formatter НЕ имеет 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)

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Полагаю, вы знакомы с синтаксисом *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.Кажется довольно маловероятным, хотя.

0 голосов
/ 26 декабря 2018

self считается первым arg в *args и распаковывается в этой строке:

self, *args = args

Объявление метода экземпляра без self в подписинеобычно в Python.

Посмотрев историю git на строку сигнатуры метода, мы можем увидеть, что изначально присутствовал self.

Он был удален, потому что егоПрисутствие вызывало ошибку, если строка формата содержала переменную с именем self, например 'I am my{self}'.Для исправления ошибки была введена необычная схема распаковки self из args.

Отчет об ошибке и обсуждение здесь .

Это примерошибка, из сообщения об ошибке:

>>> 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'
...