2015-06-18 4 views
1

Если вы забыли запятую в списке строк, Python (2.7) автоматически соедините две строки. Например:Почему Python автоматически объединяет две отдельные строки?

x = ['id', 'date' 'time'] 
print(x) 
#[id, 'datetime'] 

Такое поведение кажется, противоречит подавляющему большинству «случаи применения», где пользователь просто забыл запятую. Это приводит к отсутствию ошибки в коде или возникновению нечетного сообщения об ошибке. В приведенном выше примере, например, это был список атрибутов для объекта, и он выбрал AttributeError: 'YourObjectClass' object has no attribute 'datetime'. Является ли это признаком или ошибкой, и если это особенность, почему это функция?

+1

Это поведение не только в списке. Попробуйте 'x = 'date' 'time'' –

+0

В C: Чтобы разрешить более гибкую компоновку и решить некоторые проблемы предварительной обработки, Комитет C89 представил строковое литературное конкатенацию. Два строковых литерала подряд склеиваются вместе, без нулевого символа в середине, чтобы сделать один комбинированный строковый литерал __... Это дополнение к языку C позволяет программисту расширять строковый литерал за пределами физической линии без использование механизма обратной косой черты-новой строки » Я подозреваю, что у Python есть те же рассуждения, т. е. для уменьшения уродливых \ для продолжения длинных строковых литералов. – Burkely91

ответ

2

Это особенность, и его обоснование дано в the part of the spec that describes it:

нескольких соседних строковых литералы (разделив их пробелом), возможно, с использованием различных цитирования конвенций, разрешено, и их значение таким же, как их сцепление , Таким образом, "hello" 'world' эквивалентен "helloworld". Эта функция может быть использована для уменьшения количества обратных косых черт, необходимых, чтобы разбить длинные строки удобно через длинные линии, или даже добавлять комментарии к части строк, например:

re.compile("[A-Za-z_]"  # letter or underscore 
      "[A-Za-z0-9_]*" # letter, digit or underscore 
     ) 
1

Эта функция называется строка буквальная конкатенация.

Строка буквальная конкатенация

несколько соседних строковых литералов (разделенный пробел), возможно, с использованием различных цитирования конвенции, будут разрешена, и их значение же, как и их конкатенация. Таким образом, "hello"'world' эквивалентен до "helloworld". Эта функция может быть использована для уменьшения количества обратной косой черты необходимо, чтобы разделить длинные строки удобно через длинные линии, или даже добавлять комментарии к частям строк:

re.compile("[A-Za-z_]"  # letter or underscore 
      "[A-Za-z0-9_]*" # letter, digit or underscore 
     ) 

Эта функция определяется в синтаксической уровня, но реализованы во время компиляции.

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