如何在python中实现前向兼容的字符串文字?

时间:2012-08-25 11:58:50

标签: python string python-3.x literals

我有一个使用python 3运行的脚本,除了字符串文字。 Python 2.x强迫我用字符串文字加上u''和python 3,不了解它。 如何解决?

3 个答案:

答案 0 :(得分:1)

在python 2.x中运行时尝试这个:

>>> from __future__ import unicode_literals
>>> s=['xx','yy','zz','aa']
>>> s
[u'xx', u'yy', u'zz', u'aa']

在python 3.x中执行时相同:

>>> from __future__ import unicode_literals
>>> s=['xx','yy','zz','aa']
>>> s
['xx', 'yy', 'zz', 'aa']

答案 1 :(得分:1)

一些选择:

您可以使用以下兼容性功能将所有unicode字符串写为u("a\u0020")。类似的技巧可以让你在Python 2.5下支持b('')字节。尽管有额外的函数调用,但是性能有点小。 (这是six 2/3兼容性库使用的内容)。

if sys.version_info < (3,0):
    def u(s):
        return s.decode("unicode_escape")
else:
    def u(s):
        return s

其次,如果您不必支持Python 2.5,则可以使用from __future__ import unicode_literals,该模块的Python 2.6 / 2.7字符串的行为与3.x相同。

最后,如果您不必支持Python 3.0-3.2,则可以使用u'',因为Python 3.3重新添加了对u''前缀的支持,因为流行压力(主要来自webframework)开发人员)。

答案 2 :(得分:0)

您使用包装器方法,通常称为u

这是我的版本(来自Porting to Python 3,如果你同时支持Python 2和Python 3,你应该阅读。):

import sys
if sys.version < '3':
    import codecs
    def u(x):
        return codecs.unicode_escape_decode(x)[0]
else:
    def u(x):
        return x

然后使用u('String')代替u'String'。对于非ascii文本,您需要使用\x00\u0000\N{name}语法。

Python 3.3将再次支持你的语法,以避免这种情况,但它仍处于测试阶段。

from __future__ import unicode_literas功能已被证明没什么用处,因为您需要使用包装器来制作本机字符串,这不是一种改进。