为 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)
返回True
(它没有返回),因为导入 unicode_literals 应该使所有字符串类型都成为 unicode。(编辑:)因为在 Python 3 中,所有字符串都是 Unicode 字符序列,所以我希望str(''))
返回这样一个 unicode 字符串,并且type(str(''))
既是 <type 'unicode'>
,又 <type 'str'>
是(因为所有字符串都是 unicode)但也意识到<type 'unicode'> is not <type 'str'>
. 周围一片混乱……
问题
- 我怎样才能最好地传递包含'
\u
'的字符串?(不写'\\u
') - 是否
from __future__ import unicode_literals
真的实现了所有 Python 3. 相关的 unicode 更改,以便我获得完整的 Python 3 字符串环境?
编辑:在 Python 3 中,<type 'str'>
是一个 Unicode 对象,<type 'unicode'>
根本不存在。就我而言,我想为 Python 2(.6) 编写可在 Python 3 中运行的代码。但是当我 时import unicode_literals
,我无法检查字符串是否为,<type 'unicode'>
因为:
- 我假设
unicode
不是命名空间的一部分 - if
unicode
是命名空间的一部分,<type 'str'>
当它在同一个模块中创建时,它的文字仍然是 unicode type(mystring)
将始终返回<type 'str'>
Python 3 中的 unicode 文字
# coding: UTF-8
我的模块过去常常通过顶部的注释以“utf-8”编码,而我的locale.getdefaultlocale()[1]
返回“cp1252”。因此,如果我MyObject('çça')
从控制台调用,它在 Python 2 中编码为“cp1252”,MyObject('çça')
从模块调用时编码为“utf-8”。在 Python 3 中,它不会被编码,而是一个 unicode 文字。
编辑:
我放弃了希望避免在 a 之前使用 '\' u
(或x
就此而言)。我也了解导入的限制unicode_literals
。但是,将字符串从模块传递到控制台的许多可能组合,反之亦然,每种不同的编码,以及是否导入unicode_literals
以及 Python 2 与 Python 3,让我想通过实际测试来创建一个概述。因此下表。
换句话说,在 Python 3type(str(''))
中不会返回<type 'str'>
,但是<class 'str'>
, 和 Python 2 的所有问题似乎都可以避免。