Вот разбивка определенного синтаксиса форматирования . С помощью метода str.format
вы можете заполнить заполнители в данном экземпляре строки в форме {...}
. Они работают с позиционными аргументами следующим образом:
>>> '{}:{}'.format(1, 2)
'1:2'
>>> '{0}:{1}'.format(1, 2)
'1:2'
>>> '{1}:{0}'.format(1, 2)
'2:1'
Это означает, что вы можете указать номер позиционного аргумента внутри фигурных скобок. Строка может ссылаться на позиционный аргумент несколько раз:
>>> '{0}:{1}:{0}'.format(1, 2)
'1:2:1'
Использование нотации .x
позволяет получить доступ к атрибутам этого аргумента. Например:
>>> class Test:
... x = 1
... y = 2
...
>>> '{0.x}:{0.y}'.format(Test)
'1:2'
Используя !r
, вы можете принудительно использовать __repr__
этого объекта вместо __str__
. Например:
>>> class Test:
... def __str__(self):
... return '__str__'
... def __repr__(self):
... return '__repr__'
...
>>> '{0}'.format(Test())
'__str__'
>>> '{0!s}'.format(Test())
'__str__'
>>> '{0!r}'.format(Test())
'__repr__'
Таким образом, объединяя всю эту информацию, мы получаем следующее:
'Point({0.x!r}, {0.y!r})'.format(self)
Здесь определена строка формата с двумя заполнителями ({0.x!r}
и {0.y!r}
). Они должны быть заполнены атрибутами x
и y
первого позиционного аргумента (напомним, что {0}
будет заменен первым аргументом, поэтому {0.x}
запрашивает атрибут x
этого аргумента). И, наконец, !r
запрашивает __repr__
этого объекта, а не __str__
(который используется по умолчанию).
То же самое относится и к методу __str__
.
Кстати, синтаксис форматирования также допускает аргументы ключевых слов, и на них можно ссылаться по их имени:
>>> '{first}:{second}'.format(first=1, second=2)
'1:2'
>>> '{second}:{first}'.format(first=1, second=2)
'2:1'