如何在没有外部模块的情况下跨python 2和3透明地处理字符串?

时间:2019-12-11 20:32:32

标签: python python-2to3

在不使用six之类的第三方模块的情况下,可以在python2和python3中使用的最简单的通用字符串处理方法是什么?

我可以使用if sys.version_info > (3, 0)...,但是无法提出一种方法来完全覆盖字符串方法以使在字节之间的编码/解码透明吗?

目标是找到可能的最少代码,以允许编写独立于版本的脚本(不依赖)。

2 个答案:

答案 0 :(得分:4)

six source code不太复杂,所以为什么不只将字符串部分复制到代码库中呢?这样,您便拥有了一种完善的统一字符串处理方法。即下面的代码应该做:

import sys

PY2 = sys.version_info[0] == 2
PY3 = sys.version_info[0] == 3

if PY3:
    text_type = str
    binary_type = bytes
else:
    text_type = unicode
    binary_type = str


def ensure_binary(s, encoding='utf-8', errors='strict'):
    if isinstance(s, text_type):
        return s.encode(encoding, errors)
    elif isinstance(s, binary_type):
        return s
    else:
        raise TypeError("not expecting type '%s'" % type(s))


def ensure_str(s, encoding='utf-8', errors='strict'):
    if not isinstance(s, (text_type, binary_type)):
        raise TypeError("not expecting type '%s'" % type(s))
    if PY2 and isinstance(s, text_type):
        s = s.encode(encoding, errors)
    elif PY3 and isinstance(s, binary_type):
        s = s.decode(encoding, errors)
    return s


def ensure_text(s, encoding='utf-8', errors='strict'):
    if isinstance(s, binary_type):
        return s.decode(encoding, errors)
    elif isinstance(s, text_type):
        return s
    else:
        raise TypeError("not expecting type '%s'" % type(s))

答案 1 :(得分:1)

在每个文件中,将此行添加到每个文件的顶部

PY3 = sys.version_info[0] == 3
if PY3:
    from builtins import str as unicode