Сделана ли в Python Language Reference ошибка, связанная с строковыми литералами? - PullRequest
1 голос
/ 02 ноября 2019

Я внимательно изучал Справочник по языку Python, для некоторых карточек Anki, которые я пишу. И кажется, что я наткнулся на загадку при переходе по строковым литералам.

См. Здесь: вызов функции print("can't") возвращает can't.

Но я не смог найти в документах ничего, что бы предполагало, что это даже возможно!

Рассмотрим этот отрывок из формального определения:

shortstring     ::= "'" shortstringitem* "'" | '"' shortstringitem* '"'
longstring      ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""'
shortstringitem ::= shortstringchar | stringescapeseq
longstringitem  ::= longstringchar | stringescapeseq
shortstringchar ::= <any source character except "\" or newline or the quote>
longstringchar  ::= <any source character except "\">
stringescapeseq ::= "\" <any source character>`

Источник


Как вы можете сказать, последовательность "can't" представляет собой короткую строку . Это потому, что это группа из нуля или более коротких строковых элементов , окруженных соответствующими группами двойных кавычек.

И коротких строковых элементов может быть короткие строки или escape-последовательности строк.

Поскольку в последовательности "can't" нет escape-последовательностей строк, давайте рассмотрим короткие строки символов . В определении говорится, что кавычка (') является , а не a коротким символом .

Поскольку кавычка не является коротким символом , имеет смысл, что print('can't') выдает синтаксическую ошибку. Почему print("can't") не следует тем же правилам?

Я чувствую, что Справочник по языку Python допустил ошибку здесь. Мысли?

1 Ответ

2 голосов
/ 02 ноября 2019

Поскольку "can't" начинается с двойной кавычки, вам разрешено иметь одинарную кавычку в литерале.

shortstringchar ::= <any source character except "\" or newline or the quote>

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

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