Получить предупреждение для строковых литералов Python без префикса 'u' - PullRequest
3 голосов
/ 09 сентября 2010

Чтобы следовать рекомендациям по Unicode в python , вы должны ставить перед всеми строковыми литералами символов символ 'u'. Существует ли какой-либо инструмент (предпочтительно совместимый с PyDev), который предупреждает, если вы его забудете?

Ответы [ 3 ]

4 голосов
/ 09 сентября 2010

Вы должны префиксировать все строковые литералы с 'u'

Нет, не совсем.

Вы должны префиксировать литералы для строк символов с u.Но не все строки являются строками символов.Когда вы говорите с компонентами, основанными на байтах, такими как сетевые службы или двоичные файлы, вам необходимо использовать байтовые строки.

например.Хотите попробовать записать строку Unicode в файл PNG?Не разумноХотите base64-декодировать строку Y2Fm6Q==?Вы не можете разумно использовать строку Unicode здесь, base64 явно байты.

Конечно, Python часто позволяет вам избежать передачи строки Unicode, где ожидается строка байта, но только путем автоматического кодирования в ASCII,Если строка содержит не-ASCII-символы, вы получите UnicodeError точно так же, как если бы вы использовали байты там, где ожидался Unicode.«Юникод правильный, байты неправильные» - разрушительный миф.Требуется манипулирование для обоих типов строк.

Если вы обеспокоены переходом на Python 3, вам, безусловно, следует пометить строки символов как u'', но затем вы также должны отметить свои явно байтыстроки как b''.Строки, где не имеет значения, вы можете оставить как '' и позволить им преобразовываться из байтовых строк в строки Unicode на Python 3. Есть много случаев, когда Python 2 использовал байты, а Python 3 использовал Unicode там, где это уместно.сделать это.Но есть еще много случаев, когда вам действительно нужно говорить байты, и преобразование этого в Python 3 в качестве юникода вызовет проблемы.

(Единственная проблема с этим состоит в том, что синтаксис b'' требует Python2.6 или более поздней, поэтому его использование сделает вас несовместимым с более ранними версиями.)

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

Возможно, вы захотите написать такой инструмент генератора боевых действий, проанализировав исходный код Python, используя встроенные модули parser или dis. Вы также можете рассмотреть возможность добавления такой функции в pylint .

1 голос
/ 09 сентября 2010

Комментарий KennyTM должен быть опубликован как ответ:

from __future__ import unicode_literals

Это будущее объявление может использоваться в Python 2.6 и 2.7 и включает строковый синтаксис Python 3, так что нефиксированные строковые литералы являются строками Unicode, а байтовые массивы требуютb префикс.

...