python - кортеж из одного элемента создает исключение для оператора for - PullRequest
0 голосов
/ 02 октября 2011

Мне любопытно, почему это происходит.Я использую шаблоны Mako для итерации по кортежу, который содержит несколько словарей, которые, в свою очередь, содержат информацию о ссылках:

links = (
        {
            'path' : request.route_url('home'),
            'text' : 'Home'
        },
        {
            'path' : "http://www.microsoft.com",
            'text' : "Microsoft"
        }
    )

Если я отправлю вышеупомянутое в представление, все будет работать как ожидалосьссылки отображаются.Однако, если я удаляю вторую ссылку:

links = (
            {
                'path' : request.route_url('home'),
                'text' : 'Home'
            }
)

, я получаю исключение: TypeError: string indices must be integers, not str

, если я ставлю запятую после конца словаря, все снова начинает работать.Кто-нибудь может объяснить, что происходит?

Редактировать Фрагмент шаблона Мако

<nav>

       % for link in links:
        <a href="${link['path']}">${link['text']}</a>
       % endfor

      </nav>

1 Ответ

5 голосов
/ 02 октября 2011

если я поставлю запятую после конца словаря, все снова начнет работать.Может кто-нибудь объяснить, что происходит?

запятая составляет кортеж.Без него у вас будет только одно значение в скобках.

x = ({}) # brackets around a dict
x = {}, # a 1-tuple
x = ({},) # a 1-tuple in brackets

Часто оказывается, что скобки являются обозначением для кортежей, потому что они появляются вместе так часто.Это только потому, что по синтаксическим причинам вам часто нужны скобки при написании кортежа.

Когда вы пишете links = ({ ... }), у вас есть только словарь, а не кортеж.Python зацикливается на своих ключах, поэтому каждый link является строкой, которую вы пытаетесь проиндексировать другой строкой, что приводит к исключению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...