Я пишу свой код для Python 2.6, но, имея в виду Python 3, я подумал, что было бы неплохо поместить
from __future__ import unicode_literals
в начало некоторых модулей. Другими словами, я прошу неприятностей (чтобы избежать их в будущем), но, возможно, мне здесь не хватает некоторых важных знаний. Я хочу иметь возможность передать строку, представляющую путь к файлу, и создать экземпляр объекта так же просто, как
MyObject ('H: \ unittests')
В Python 2.6 , это работает нормально, нет необходимости использовать двойную обратную косую черту или необработанную строку, даже для каталога, начинающегося с '\ u ..'
, что мне и нужно. В методе __ init __
я проверяю, что все одиночные вхождения \
интерпретируются как ' \\
', включая те, которые находятся перед специальными символами, как в \ a
, \ b
, \ f
, \ n
, \ r
, \ t
и ] \ v
(проблемой остается только \ x
). Также декодирование данной строки в Unicode с использованием (локальной) кодировки работает должным образом.
Подготовка к Python 3.x , имитация моей реальной проблемы в редакторе (начиная с чистой консоли в Python 2.6), происходит следующее:
>>> '\u'
'\\u'
>>> r'\u'
'\\u'
(ОК, пока здесь: ' \ u '
кодируется консолью с использованием локальной кодировки)
>>> from __future__ import unicode_literals
>>> '\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence
Другими словами, строка (unicode) вообще не интерпретируется как unicode и не декодируется автоматически с помощью локальной кодировки. Даже в этом случае для необработанной строки:
>>> r'\u'
SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX
то же самое для u '\ u'
:
>>> u'\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence
Кроме того, я ожидаю, что isinstance (str (''), unicode)
вернет Истина
(чего нет), потому что импорт unicode_literals должен сделать все строковые типы Unicode. (edit:) Поскольку в Python 3 все строки представляют собой последовательности символов Unicode , я ожидаю, что str (''))
вернет такой unicode- строка и тип (str (''))
должны быть как
, так и
(поскольку все строки являются unicode), но также следует понимать, что
. Кругом неразбериха ...
Вопросы
\ u
'? (без записи ' \\ u
') from __future__ import unicode_literals
реализуют все изменения Unicode, связанные с Python 3., чтобы я получил полную строковую среду Python 3? edit:
В Python 3
является объектом Unicode , а
просто не существует. В моем случае я хочу написать код для Python 2 (.6), который будет работать в Python 3. Но когда я импортирую unicode_literals
, я не могу проверить, имеет ли строка
потому что:
unicode
не является частью пространства имен unicode
является частью пространства имен, литерал
по-прежнему является Unicode, когда он создается в том же модуле type (mystring)
всегда будет возвращать
для литералов Unicode в Python 3 Мои модули кодируются в 'utf-8' с помощью комментария # coding: UTF-8
вверху, а мой locale.getdefaultlocale () [1]
возвращает ' cp1252 '.Поэтому, если я вызываю MyObject ('çça')
с моей консоли, он кодируется как 'cp1252' в Python 2 и как 'utf-8' при вызове MyObject ('çça')
из модуля. В Python 3 он не будет закодирован, а будет литералом Unicode.
править:
Я отказался от надежды на то, что мне позволят избежать использования '\' перед u
(или x
, если на то пошло). Также я понимаю ограничения импорта unicode_literals
. Тем не мение,множество возможных комбинаций передачи строки из модуля в консоль и наоборот с каждой другой кодировкой, а также импорт unicode_literals
или нет и Python 2 против Python 3, заставили меня захотеть создать обзор фактического тестирования. Отсюда и таблица ниже.
Другими словами, type (str (''))
не возвращает
в Python 3, но
, и, похоже, удалось избежать всех проблем Python 2.