【发布时间】:2011-11-27 23:11:20
【问题描述】:
为 Python 2.6 编写代码,但考虑到 Python 3,我认为这是一个好主意
from __future__ import unicode_literals
在一些模块的顶部。换句话说,我是在自找麻烦(为了将来避免它们),但我可能在这里遗漏了一些重要的知识。我希望能够传递一个表示文件路径的字符串并像
一样简单地实例化一个对象MyObject('H:\unittests')
在 Python 2.6 中,这工作得很好,不需要使用双反斜杠或原始字符串,即使对于以 '\u..' 开头的目录也是如此,这正是我想要的。在__init__ 方法中,我确保所有单个\ 出现都被解释为'\\',包括\a、\b、\b、\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。 (编辑:) 因为in Python 3, all strings are sequences of Unicode characters,我希望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'> is a Unicode object 和 <type 'unicode'> 根本不存在。就我而言,我想为 Python 2(.6) 编写可在 Python 3 中运行的代码。但是当我 import unicode_literals 时,我无法检查字符串是否为 <type 'unicode'>,因为:
- 我假设
unicode不是命名空间的一部分 - 如果
unicode是命名空间的一部分,则<type 'str'>在同一模块中创建时仍是unicode -
对于 Python 3 中的 unicode 文字,
type(mystring)将始终返回<type 'str'>
我的模块过去常常通过顶部的# coding: UTF-8 注释以“utf-8”编码,而我的locale.getdefaultlocale()[1] 返回“cp1252”。因此,如果我从控制台调用 MyObject('çça'),它在 Python 2 中被编码为“cp1252”,在从模块调用 MyObject('çça') 时被编码为“utf-8”。在 Python 3 中,它不会被编码,而是一个 unicode 文字。
编辑:
我放弃了在u(或x)之前避免使用'\'的希望。我也了解导入unicode_literals 的局限性。但是,将字符串从模块传递到控制台的许多可能组合,反之亦然,每种不同的编码,除此之外是否导入unicode_literals 和 Python 2 与 Python 3,让我想通过以下方式创建一个概述实际测试。因此下表。
换句话说,type(str('')) 在 Python 3 中不返回 <type 'str'>,而是返回 <class 'str'>,所有 Python 2 的问题似乎都被避免了。
【问题讨论】:
-
发现这很有帮助 blog:Ludovico Fischer 的 Python (2vs3) 中的字符串和 unicode
标签: python unicode future-proof