На самом деле, здесь возник мой вопрос

я есть кусок кода, как показано ниже:

tupvalue = [('html', 96), ('css', 115), ('map', 82)]

Поэтому, печатая вышеприведенный кортеж в нужном формате для определенного индекса, я нашел такой код:

>>> '%s:%d' % tupvalue[0]
'html:96'

Мне интересно, как единственное значениеtupvalue[0] распознается как кортеж из двух значений спецификатором формата'%s:%d'? Пожалуйста, объясните этот механизм со ссылкой на документацию.

Как я могу использовать понимание для форматирования всех значений вtupvalue в требуемом формате, как в приведенном примере?

 Julien20 окт. 2017 г., 06:39
['%s:%d'%t for t in tupvalue]?
 Sjn7320 окт. 2017 г., 06:36
@julien Пример вывода показан в вопросе
 coldspeed20 окт. 2017 г., 06:39
Это один объект, но он оценивается как кортеж из двух значений во время выполнения.
 coldspeed20 окт. 2017 г., 06:35
tupvalue[0] ->('html', 96) ->'%s:%d' %('html', 96) В чем путаница?
 Sjn7320 окт. 2017 г., 06:42
@ cᴏʟᴅsᴘᴇᴇᴅ есть ли документация, чтобы правильно понять эту функцию ??

Ответы на вопрос(1)

Решение Вопроса

Как я могу использовать понимание для форматирования всех значений вtupvalue в требуемом формате, как в приведенном примере?

Это понимание списка:['%s:%d' % t for t in tupvalue]

Теперь сложный вопрос!

как единственное значениеtupvalue[0] распознается как кортеж из двух значений спецификатором формата'%s:%d'?

Ваша интуиция о том, что здесь происходит что-то немного странное, верна.Кортежи специально написаны на языке для использования с форматированием строки.

>>> '%s:%d' % ('css', 115)  # tuple is seen as two elements
'css:115'
>>> '%s:%d' % ['css', 115]  # list is just seen as one object!
TypeError: not enough arguments for format string

Форматирование строк в процентном формате не соответствует типу утилит. Итак, если вы действительно хотите отформатировать кортеж, вам придется обернуть его в другой кортеж, в отличие от любого другого типа объекта:

>>> '%s' % []
'[]'
>>> '%s' % ((),)
'()'
>>> '%s' % ()
TypeError: not enough arguments for format string

Соответствующий раздел документации находится в разделе4.7.2.printfформатирование строкигде упоминается:

Если для формата требуется один аргумент, значения могут быть одним объектом без кортежа. В противном случае значения должны быть кортежем с точным количеством элементов, указанным в строке формата

Странная обработка кортежей - это одна из причуд, упомянутых в примечании в начале этого раздела документации, и одна из причин, по которым новый метод форматирования строкstr.format рекомендуется вместо

Обратите внимание, что обработка форматирования строки происходит ввремя выполнения†, Вы можете проверить это с помощью абстрактного синтаксического дерева:

>>> import ast
>>> ast.dump(ast.parse('"%s" % val'))
"Module(body=[Expr(value=BinOp(left=Str(s='%s'), op=Mod(), right=Name(id='val', ctx=Load())))])"

'%s' % val разбирает бинарную операцию на'%s' а такжеval, который обрабатывается какstr.__mod__(val)в CPython этоBINARY_MODULO опкод. Это означает, что это обычно доstr типа, чтобы решить, что делать, когдаval получено неверно*, который происходит только после того, как выражениеоценивалито есть как только переводчик достиг этой линии. Таким образом, не имеет значения, является лиval неправильный тип или содержит слишком мало / слишком много элементов - это ошибка времени выполнения, а не ошибка синтаксиса.

† За исключением некоторых особых случаев, когда оптимизатор глазка CPython способен «постоянно сворачивать» его во время компиляции.

* Если неvalподклассыstr, в таком случаеtype(val).__rmod__ должно быть возможность контролировать результат.

 Sjn7320 окт. 2017 г., 19:25
@Wim спасибо за такое подробное объяснение и за завершение моего вопроса, сравнивая с этим списком>>> '%s:%d' % ['css', 115] На самом деле, здесь возник мой вопрос
 coldspeed20 окт. 2017 г., 07:40
Я ценю это, это было действительно информативно. Я надеюсь, что ОП решит принять ваш ответ.

Ваш ответ на вопрос