2009-09-09 6 views
5

Почему на Земле не переводчик поднять SyntaxError каждый раз я делаю это:Проблема со списком строк в Python

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

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

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

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

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

Почему автоматическая конкатенация? Я не могу подсчитать, сколько раз я был укушен этим поведением. Есть ли что-нибудь, что я могу с этим сделать?

Просто для уточнения *: Я на самом деле не против автоматического конкатенацию, моя проблема связана только со списками строк, потому что они часто делают гораздо больше, чем просто носить текст, они используются для управления потоком , передавать имена полей и многое другое.

ответ

2

Как другие говорили, что это дизайн.

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

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

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

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

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

+1

Или поместите запятую ПОСЛЕ каждого элемента (включая последний), интерпретатор разрешает дополнительную запятую. Таким образом, если вы отформатируете свой список как одно значение на строку и переместите элементы вверх или вниз, вы не столкнетесь с этой проблемой. –

+1

Это похоже на то, что сделал оригинальный вопрос постер (и tha t и то, что я обычно делаю по причине, которую вы только что сказали), но недостающая кома в конце строки может легко исчезнуть. Противоположная проблема также возникла для меня: конечная кома в конце строки, меняющая константу на кортеж. Я считаю, что это еще труднее обнаружить, чем другое :-( – kriss

+0

принято для лучших усилий;] – kurczak

6

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

+1

Я предпочитаю использовать «» «для мультилиний строк или разбить их явно с' \ ', чем чем этот вид * магия * конкатенации. – kurczak

+0

„“» ставит новые строки между строками. – recursive

+0

Это не «волшебство». Это хорошо документировано: http://docs.python.org/reference/lexical_analysis.html#string-literal-concatenation –

3

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

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

+0

Не знаете, почему это было опущено. Я что-то неправильно? –

+0

Вопрос * почему *. Вы просто пересказали то, что происходит, что ОП уже имеет в своем посте. Если вопрос задает «Почему 10 * 2 = 20», ответ «потому что 10 * 2 = 20» не помогает. –

+0

_why_ объясняется в документах - это по дизайну и имеет варианты использования. –

2

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

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# также имеют такое поведение.

+0

"" "не делает этого, он вставляет новые строки. – recursive

+4

@kurczak: 40 лет разработчиков не согласны с вами. –

+0

@John Millikin, пожалуйста, уточните – kurczak

12

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

+1

+1 Не заставляйте говорить после прочтения этой ссылки –

Смежные вопросы