2016-09-01 4 views
0

O'Reilly's Learn Python Мощное объектно-ориентированное программирование Марка Лутца учит различным способам форматирования строк.String Форматирование Confusion

Этот следующий код меня смутил. Я интерпретирую «ham» как заполняющий маркер места формата с нулевым индексом, но все же он всплывает по индексу один из выводимой строки. Пожалуйста, помогите мне понять, что на самом деле происходит.

Вот код:

template = '{motto}, {0} and {food}' 
template.format('ham', motto='spam', food='eggs') 

А вот выход:

'spam, ham and eggs' 

я ожидал:

'ham, spam and eggs' 
+0

Я думаю, вы просто сбиваете с толку себя. То, что вы сказали, правильно. «ham» - индексный ноль, который заменяет «{0}». Таким образом, '{motto}, {0} и {food}' -> '{motto}, ветчина и {еда}'. – kojiro

+0

«Я интерпретирую« ветчину »как заполняющую маркер места формата с нулевым индексом» - нет, он заполняет заполнитель нулем в нем. – user2357112

+0

Взгляните на [pyformat.info] (https://pyformat.info). –

ответ

2

Единственное, что вы должны понять, что {0} относится к первому (нулевому) неназванным argume nt отправлено в format(). Мы можем видеть, что это дело, удалив все неназванные ссылки и пытается использовать линейную заливку-в:

>>> "{motto}".format("boom") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
KeyError: 'motto' 

Вы ожидали бы, что «бум» будет заполнить «девиза», если это то, как он работает. Но вместо этого format() ищет параметр с именем 'девиз'. Ключевым намеком здесь является KeyError. Точно так же, если бы это было просто принимать последовательность параметров, переданные format(), то это будет не ошибка, либо:

>>> "{0} {1}".format('ham', motto='eggs') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: tuple index out of range 

Здесь format() ищет второй безымянный аргумент в списке параметров - но это Безразлично» t, поэтому он получает ошибку «кортеж индекса вне диапазона». Это просто разница между неназванными (которые являются позиционно чувствительными) и именованными аргументами, переданными в Python.

See this post to understand the difference between these types arguments, known as 'args' and 'kwargs'.

+0

Обоснование аргументов с нулевым аргументом помогло мне понять. Спасибо. Теперь, когда я помню, в книге говорилось, что в этом примере использовались как ключевые слова, так и позиция. –