Python2和Python3中的bytes.decode()

时间:2019-08-12 15:03:36

标签: python arrays python-3.x decode python-2.x

sqlalchemy的源代码中,我看到了

    val = cursor.fetchone()[0]
    if util.py3k and isinstance(val, bytes):
        val = val.decode()

为什么我们只对Python3解码而不对Python2解码?

2 个答案:

答案 0 :(得分:3)

Python 3 中,“常规”字符串为 Unicode (与 Python 2 相对,它们在其中( Extended ASCII (或 ANSI ))。根据{{​​3}}:

  

从Python 3.0开始,该语言的[Python 3.Docs]: Unicode HOWTO - The String Type类型包含Unicode字符,这意味着使用"unicode rocks!"'unicode rocks!'或三引号字符串语法创建的任何字符串都将存储为Unicode。

>

示例:

  • Python 3

    >>> import sys
    >>> sys.version
    '3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)]'
    >>>
    >>> b = b"abcd"
    >>> s = "abcd"
    >>> u = u"abcd"
    >>>
    >>> type(b), type(s), type(u)
    (<class 'bytes'>, <class 'str'>, <class 'str'>)
    >>>
    >>> b.decode()
    'abcd'
    >>> s.decode()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'str' object has no attribute 'decode'
    >>> u.decode()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'str' object has no attribute 'decode'
    
  • Python 2

    >>> import sys
    >>> sys.version
    '2.7.10 (default, Mar  8 2016, 15:02:46) [MSC v.1600 64 bit (AMD64)]'
    >>>
    >>> b = b"abcd"
    >>> s = "abcd"
    >>> u = u"abcd"
    >>>
    >>> type(b), type(s), type(u)
    (<type 'str'>, <type 'str'>, <type 'unicode'>)
    >>>
    >>> b.decode()
    u'abcd'
    >>> s.decode()
    u'abcd'
    >>> u.decode()
    u'abcd'
    

val 将作为 str 进一步传递(传递给 _parse_server_version )。由于在 Python 3 中,字节 str 不同,因此将执行转换。

答案 1 :(得分:1)

您可以查看详细信息documentation of string encoding frustration here

简而言之,由于SQLAlchemy包含将数据解析为字节数据的旧版API,因此上述语句是将字符串字节数据迁移至python 3中的Unicode的简单方法。