Проблема со списком строк в Python - PullRequest
5 голосов
/ 09 сентября 2009

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

my_abc = ['a',
          'b',
          'c'
          'd',]

Я просто хотел добавить 'c' в список строк и забыл добавить запятую. Я ожидал бы, что это вызовет какую-то ошибку, поскольку это неверно.

Вместо того, что я получил:

>>> my_abc
 ['a', 'b', 'cd']

И это никогда , что я хочу.

Почему он автоматически объединяется? Я не могу сосчитать, сколько раз меня укусило это поведение Что я могу с этим поделать?

Просто чтобы прояснить *: на самом деле я не возражаю против автоконкатенации, моя проблема связана ТОЛЬКО со списками строк, потому что они часто делают гораздо больше, чем просто переносят текст, они используются управлять потоком, передавать имена полей и многое другое.

Ответы [ 5 ]

12 голосов
/ 09 сентября 2009

Называется "неявная конкатенация строк", и PEP, предложивший его удаление, был отклонен: http://www.python.org/dev/peps/pep-3126/

6 голосов
/ 09 сентября 2009

Это по замыслу. Это позволяет, например, писать длинные строковые литералы в несколько строк без использования +.

3 голосов
/ 09 сентября 2009

Поскольку два строковых литерала бок о бок, разделенные пробелами, объединены. Поскольку строки находятся в списке, они расположены рядом друг с другом.

См .: http://docs.python.org/reference/lexical_analysis.html#string-literal-concatenation

2 голосов
/ 10 сентября 2009

Как говорили другие, это по замыслу.

Почему это так? Главным образом по историческим причинам: C также делает это.

В некоторых случаях это удобно, поскольку снижает синтаксический шум и позволяет избежать добавления нежелательных пробелов (встроенные запросы SQL, регулярные выражения комплексов и т. Д.).

Что вы можете с этим поделать? Немного, но если это действительно часто случается с вами, попробуйте один из следующих приемов.

  • Сделайте отступ в вашем списке с запятой в начале строки. Это странно, но если вы сделаете это, пропавшие комы станут очевидными.
  • присваивает строки переменным и использует список переменных всякий раз, когда это возможно (и часто это хорошая идея по другим причинам, например, избегая дублирования строк).
  • разделить ваш список: для списка слов вы можете поместить весь список в одну строку и разбить его, как показано ниже. Для более чем 5 элементов он также короче.

    'a b c d e'.split (' ').

2 голосов
/ 09 сентября 2009

Потому что часто люди хотят сделать что-то вроде этого:

line = ("Here's a very long line, with no line breaks,"
        " which should be displayed to the user (perhaps"
        " as an error message or question box).")

Проще написать это без необходимости объединять строки вручную. C, C ++ и (я считаю) Java и C # также имеют такое поведение.

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