Что именно делает & ldquo; u & rdquo; и & ldquo; r & rdquo; строковые флаги, а что такое необработанные строковые литералы

564
задан wim 10 October 2018 в 19:54
поделиться

3 ответа

На самом деле нет никаких «RAW строки ; Существуют сырые строковые литералы , которые являются именно строковыми литералами, отмеченными 'R' до открытия цитаты.

«Сырая строковая буквальная буква» - это немного другой синтаксис для строкового литерала, в котором обратная косание, \ , принимается как значение «просто обратная косания» (за исключением того, когда он приходит прямо перед цитатой Это в противном случае расторгнет литерал) - нет «escape Sequences» для представления новых линий, вкладок, задних пространств, форм-каналов и так далее. В нормальных строковых литералах каждая обратная косание должно быть удвоилось, чтобы избежать принятия в качестве начала escape Sequence.

Этот вариант синтаксиса существует в основном, поскольку синтаксис шаблонов регулярных выражений тяжелый с обратной косами (но никогда не в конце, поэтому «кроме» выше, не имеет значения), и он выглядит немного лучше, когда вы избегаете удваивания каждого Из них - это все. Он также получил некоторую популярность для выражения нативных путей файлов Windows (с обратной ячейками вместо регулярных косой, как на других платформах), но это очень редко нужно (поскольку обычные кособыки в основном работают нормально на окнах) и несовершенственным (из-за «кроме». над).

R '...' ... ' - это байтовая строка (в Python 2. *), ur' ... ' - это строка Unicode (снова в Python 2. *), И любой из других трех видов цитирования также производит точно такие же типы строк (например, R '...' , R '' '...' '' R "..." , R "" "..." "" - все байтовые струны, и так далее).

Не уверены, что вы подразумеваете под «ходом назад - нет никаких искренних и передовых направлений, потому что нет необработанной строки тип , это просто альтернативный синтаксис, чтобы отлично Нормальные строковые объекты, байт или Unicode, как они могут быть.

И да, в Python 2. *, U '...' , конечно, всегда отличается от всего '...' - первое Строка Unicode, последний - это байтовая строка. То, что кодирует литерал, может быть выражен, является полностью ортогональной проблемой.

E.G. Считайте (Python 2.6):

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

Объект Unicode конечно требует больше места памяти (очень небольшая разница для очень короткой строки, очевидно, ;-).

640
ответ дан 22 November 2019 в 22:00
поделиться

Проект архитектуры S # arp является отличной отправной точкой для руководства по применению DDD. Он основан на NHibernate, но используемые принципы должны иметь равное значение для EF...

-121--2467932-

Префикс «u» означает, что значение имеет тип юникод , а не str .

Необработанные строковые литералы с префиксом «r» пропускают любые побеги последовательности в них, поэтому len (r «\n ») равно 2. Поскольку они выходят за рамки побега последовательностей, невозможно завершить литерал последовательности одной обратной косой чертой: это недопустимый побег последовательности (например, r «\» ).

«Raw» не является частью типа, это просто один из способов представления значения. Например, «\\n » и r «\n» являются идентичными значениями, как и 32 , 0x20 и 0b100000 .

Можно использовать строковые литералы Юникода:

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

Кодировка исходного файла просто определяет, как интерпретировать исходный файл, иначе это не влияет на выражения или типы. Однако рекомендуется избегать кода, в котором кодировка, отличная от ASCII, изменит значение:

Файлы, использующие ASCII (или UTF-8, для Python 3,0), не должны иметь кодирующий cookie. Latin-1 (или UTF-8) следует использовать только в том случае, если в комментарии или строке документа необходимо указать имя автора, которое требует Latin-1; в противном случае использование\x ,\u или\U побегов является предпочтительным способом включения данных, не относящихся к ASCII, в строковые литералы.

-121--1787219-

В питоне существует два типа последовательности: традиционный тип str и более новый тип unicode . Если вы вводите литерал последовательности без u спереди, вы получаете старый тип str , в котором хранятся 8-битные символы, и с u спереди вы получаете новый тип unicode , который может хранить любой символ Юникода.

r не изменяет тип, он просто изменяет способ интерпретации литерала последовательности. Без r обратная косая черта обрабатывается как побег символы. С помощью r обратная косая черта обрабатывается как литерал. В любом случае, тип тот же.

ur - это последовательность Юникода, где обратная косая черта является литеральной обратной косой чертой, а не частью кодов побега.

Можно попытаться преобразовать последовательность Юникода в старую последовательность с помощью функции str () , но при наличии символов Юникода, которые не могут быть представлены в старой последовательности, появится исключение. Вы можете заменить их вопросительными знаками, если хотите, но это, конечно, приведет к тому, что эти символы будут нечитаемыми. Не рекомендуется использовать тип str , если необходимо правильно обрабатывать символы Юникода.

167
ответ дан 22 November 2019 в 22:00
поделиться

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

-121--2889094-

Проект архитектуры S # arp является отличной отправной точкой для руководства по применению DDD. Он основан на NHibernate, но используемые принципы должны иметь равное значение для EF...

-121--2467932-

Префикс «u» означает, что значение имеет тип юникод , а не str .

Необработанные строковые литералы с префиксом «r» пропускают любые побеги последовательности в них, поэтому len (r «\n ») равно 2. Поскольку они выходят за рамки побега последовательностей, невозможно завершить литерал последовательности одной обратной косой чертой: это недопустимый побег последовательности (например, r «\» ).

«Raw» не является частью типа, это просто один из способов представления значения. Например, «\\n » и r «\n» являются идентичными значениями, как и 32 , 0x20 и 0b100000 .

Можно использовать строковые литералы Юникода:

>>> u = ur"\n"
>>> print type(u), len(u)
<type 'unicode'> 2

Кодировка исходного файла просто определяет, как интерпретировать исходный файл, иначе это не влияет на выражения или типы. Однако рекомендуется избегать кода, в котором кодировка, отличная от ASCII, изменит значение:

Файлы, использующие ASCII (или UTF-8, для Python 3,0), не должны иметь кодирующий cookie. Latin-1 (или UTF-8) следует использовать только в том случае, если в комментарии или строке документа необходимо указать имя автора, которое требует Latin-1; в противном случае использование\x ,\u или\U побегов является предпочтительным способом включения данных, не относящихся к ASCII, в строковые литералы.

33
ответ дан 22 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: