如何在没有外部模块的情况下跨 pythons 2 和 3 透明地处理字符串?
How to handle strings transparently across pythons 2 and 3 without external modules?
在 python2 和 python3 中都可以使用而无需使用像 six 这样的第三方模块的最简单的通用字符串处理方法是什么?
我可以使用 if sys.version_info > (3, 0)...
但无法想出一种方法来干净地覆盖字符串方法以使 encoding/decoding 与字节透明?
目标是找到允许编写独立的版本不可知脚本(没有依赖项)的最少可能代码。
six source code 并不太复杂,为什么不直接将字符串部分复制到您的代码库中呢?这样你就有了一个完善的统一字符串处理方法。 IE。下面的代码应该做:
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))
在每个文件中,将此行添加到每个文件的顶部
PY3 = sys.version_info[0] == 3
if PY3:
from builtins import str as unicode
在 python2 和 python3 中都可以使用而无需使用像 six 这样的第三方模块的最简单的通用字符串处理方法是什么?
我可以使用 if sys.version_info > (3, 0)...
但无法想出一种方法来干净地覆盖字符串方法以使 encoding/decoding 与字节透明?
目标是找到允许编写独立的版本不可知脚本(没有依赖项)的最少可能代码。
six source code 并不太复杂,为什么不直接将字符串部分复制到您的代码库中呢?这样你就有了一个完善的统一字符串处理方法。 IE。下面的代码应该做:
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))
在每个文件中,将此行添加到每个文件的顶部
PY3 = sys.version_info[0] == 3
if PY3:
from builtins import str as unicode