编写我的Python 2.6代码,但考虑到Python 3,我觉得放一个
是个好主意from __future__ import unicode_literals
在某些模块的顶部。换句话说,我要求麻烦(将来要避免它们),但我可能会遗漏一些重要的知识。我希望能够传递表示文件路径的字符串并实例化一个简单的对象
MyObject('H:\unittests')
在 Python 2.6 中,这很好用,不需要使用双反斜杠或原始字符串,即使对于以'\u..'
开头的目录,这正是我想要的。在__init__
方法中,我确保所有单\
次出现都被解释为“\\
”,包括特殊字符之前的\a
,\b
,{ {1}},\f
,\n
,\r
和\t
(仅\v
仍有问题)。还使用(本地)编码将给定字符串解码为unicode按预期工作。
准备 Python 3.x ,在编辑器中模拟我的实际问题(从Python 2.6中的干净控制台开始),会发生以下情况:
\x
(确定直到此处:>>> '\u'
'\\u'
>>> r'\u'
'\\u'
由控制台使用本地编码进行编码)
'\u'
换句话说,(unicode)字符串根本不被解释为unicode,也不会使用本地编码自动解码。对于原始字符串也是如此:
>>> 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
>>> 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。 (编辑:)由于in Python 3, all strings are sequences of Unicode characters,我希望True
返回此类unicode字符串,str(''))
同时返回type(str(''))
,并且<type 'unicode'>
(因为所有字符串都是unicode),但也意识到<type 'str'>
。周围的困惑......
问题的
<type 'unicode'> is not <type 'str'>
”的字符串? (不写'\u
')\\u
真正实现了所有与Python 3.相关的unicode更改,以便我获得完整的Python 3字符串环境?编辑:
在Python 3中, <type 'str'>
is a Unicode object 和from __future__ import unicode_literals
根本不存在。在我的情况下,我想编写适用于Python 3的Python 2(.6)代码。但是当我<type 'unicode'>
时,我无法检查字符串是否为import unicode_literals
,因为:
<type 'unicode'>
不是命名空间的一部分unicode
是命名空间的一部分,则unicode
的文字在同一模块中创建时仍然是unicode <type 'str'>
将始终为Python 3中的unicode文字返回type(mystring)
我的模块使用顶部的<type 'str'>
注释以'utf-8'编码,而我的# coding: UTF-8
返回'cp1252'。因此,如果我从我的控制台调用locale.getdefaultlocale()[1]
,它在Python 2中编码为'cp1252',在从模块调用MyObject('çça')
时编码为'utf-8'。在Python 3中,它不会被编码,而是一个unicode文字。
编辑:
我放弃了允许在MyObject('çça')
(或u
之前)避免使用'\'的希望。另外,我了解导入x
的限制。但是,从模块到控制台传递字符串的许多可能组合,以及每种不同的编码反之亦然,除了导入unicode_literals
之外,还有Python 2与Python 3之间的导入,这让我想创建一个通过实际测试概述。因此下表。
换句话说,unicode_literals
不会在Python 3中返回type(str(''))
,而是<type 'str'>
,并且似乎可以避免所有Python 2问题。
答案 0 :(得分:16)
AFAIK,from __future__ import unicode_literals
所做的就是使所有字符串文字为unicode类型,而不是字符串类型。那就是:
>>> type('')
<type 'str'>
>>> from __future__ import unicode_literals
>>> type('')
<type 'unicode'>
但str
和unicode
仍然是不同的类型,它们的行为与以前一样。
>>> type(str(''))
<type 'str'>
始终属于str
类型。
关于r'\u'
问题,这是设计使然,因为它相当于没有unicode_literals
的ru'\ u'。来自文档:
当'r'或'R'前缀与'u'或'U'前缀一起使用时,处理\ uXXXX和\ UXXXXXXXX转义序列,而所有其他反斜杠都留在字符串中。< / p>
可能来自词法分析器在python2系列中的工作方式。在python3中它可以像你(和我)一样工作。
您可以键入反斜杠两次,然后{@ 1}}将不会被解释,但您将获得两个反斜杠!
可以使用前面的反斜杠转义反斜杠;但是,两者都保留在字符串
中
\u
恕我直言,你有两个简单的选择:
不要使用原始字符串,并转义反斜杠(与python3兼容):
>>> ur'\\u'
u'\\\\u'
过于聪明并利用unicode代码点(不与python3兼容):
'H:\\unittests'
答案 1 :(得分:0)
对我来说,此问题与版本不相关,在本例中为numpy
修复:
conda install -f numpy
答案 2 :(得分:-1)
我在Python 3上试试这个:
导入os
os.path.abspath则(&#34; yourPath&#34)
它已经奏效了!
答案 3 :(得分:-2)
当您编写包含反斜杠的字符串文字时,例如路径(在Windows上)或正则表达式,请使用原始字符串。这就是他们的目的。