26

为 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仍然是一个问题)。使用(本地)编码将给定的字符串解码为 un​​icode 也可以按预期工作。

为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不是命名空间的一部分
  • ifunicode是命名空间的一部分,<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 的所有问题似乎都可以避免。

4

4 回答 4

20

AFAIK,from __future__ import unicode_literals所做的就是使所有字符串文字都是 unicode 类型,而不是字符串类型。那是:

>>> type('')
<type 'str'>
>>> from __future__ import unicode_literals
>>> type('')
<type 'unicode'>

但是strandunicode仍然是不同的类型,它们的行为和以前一样。

>>> type(str(''))
<type 'str'>

总是,是str类型。

关于您的r'\u'问题,这是设计使然,因为它相当于 ru'\u' without unicode_literals. 从文档:

当 'r' 或 'R' 前缀与 'u' 或 'U' 前缀一起使用时,将处理 \uXXXX 和 \UXXXXXXXX 转义序列,而所有其他反斜杠都留在字符串中。

可能来自词法分析器在 python2 系列中的工作方式。在 python3 中,它可以按照您(和我)的预期工作。

您可以键入两次反斜杠,然后\u将不会被解释,但您会得到两个反斜杠!

反斜杠可以用前面的反斜杠转义;但是,两者都保留在字符串中

>>> ur'\\u'
u'\\\\u'

所以恕我直言,你有两个简单的选择:

  • 不要使用原始字符串,并转义反斜杠(与 python3 兼容):

    'H:\\unittests'

  • 过于聪明并利用 unicode 代码点(与 python3兼容):

    r'H:\u005cunittests'

于 2011-09-29T19:38:04.343 回答
0

对我来说,这个问题与版本不是最新的有关,在这种情况下numpy

修理 :

conda install -f numpy
于 2017-02-12T14:59:34.170 回答
-1

我在 Python 3 上试试这个:

导入操作系统

os.path.abspath("你的路径")

它成功了!

于 2017-11-02T06:38:04.023 回答
-2

当您编写包含反斜杠的字符串文字时,例如路径(在 Windows 上)或正则表达式,请使用原始字符串。这就是他们的目的。

于 2011-09-29T19:40:41.293 回答