在sqlalchemy的源代码中,我看到了
val = cursor.fetchone()[0]
if util.py3k and isinstance(val, bytes):
val = val.decode()
为什么我们只对Python3解码而不对Python2解码?
答案 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的简单方法。