【问题标题】:How to achieve forward compatible string literals in python?如何在python中实现前向兼容的字符串文字?
【发布时间】:2012-08-25 11:58:50
【问题描述】:

我有一个使用 python 3 运行的脚本,除了字符串文字。 Python 2.x 强制我用 u'' 作为字符串文字的前缀,而 python 3 不理解它。 怎么解决?

【问题讨论】:

  • 等待 python 3.3 并仅使用 b''u'' 来表示字符串。否则你可以使用一些(坏的)技巧或2to3 脚本
  • '表示字符串'?你什么意思?

标签: python string python-3.x literals


【解决方案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']

【讨论】:

  • 这适用于 2.6+。早期的 2.x 不支持 unicode_literals
  • @gnibbler 这让我很满意 :),但很高兴知道
【解决方案2】:

几个选项:

您可以使用以下兼容性函数将所有 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'' 前缀的支持。

【讨论】:

    【解决方案3】:

    您使用包装器方法,通常称为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 将再次支持 u'' 语法以避免这种情况,但它仍处于测试阶段。

    from __future__ import unicode_literas 功能已被证明用处不大,因为您随后需要使用包装器来制作原生字符串,这并不是一种改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-20
      相关资源
      最近更新 更多