Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Python 2允许对字符串对象使用.encode()?_Python_Python 2.7_Unicode_Python Unicode - Fatal编程技术网

为什么Python 2允许对字符串对象使用.encode()?

为什么Python 2允许对字符串对象使用.encode()?,python,python-2.7,unicode,python-unicode,Python,Python 2.7,Unicode,Python Unicode,在Python2中,可以调用str.decode获取unicode对象,调用unicode.encode获取str对象 >>> "foo".decode('utf-8') u'foo' >>> u"foo".encode('utf-8') 'foo' Python 3与之类似,使用bytes.decode获取字符串,使用str.encode获取bytes对象 >>> "foo".encode('utf-8') b'foo' >>

在Python2中,可以调用
str.decode
获取unicode对象,调用
unicode.encode
获取str对象

>>> "foo".decode('utf-8')
u'foo'
>>> u"foo".encode('utf-8')
'foo'
Python 3与之类似,使用
bytes.decode
获取字符串,使用
str.encode
获取bytes对象

>>> "foo".encode('utf-8')
b'foo'
>>> b"foo".decode('utf-8')
'foo'
但是,Python2(而不是Python3)也提供了错误的方法:可以在
str
对象上调用
.encode
,或者在unicode对象上调用
.decode

>>> "foo".encode('utf-8')
'foo'
>>> u"foo".decode('utf-8')
u'foo'

为什么会这样?在unicode对象上调用
.decode
有用吗?反之亦然?

因为在Python 2中,您希望以字节字符串(
str
对象)和unicode字符串(
unicode
对象)交换、透明地处理文本。当需要bytestring时,
unicode
对象被透明地编码(到ASCII),反之,当需要unicode时,
str
对象被透明地解码,再次假定为ASCII

所以
str.encode()
将首先解码,然后再次编码。或者
unicode.decode()
将首先编码,然后解码结果

只有当您的代码希望接受
str
unicode
对象并将其互换处理时,才可以使用此选项。因此,即使您传入一个仅包含ASCII码点的
unicode
对象,一个需要ByTestString并尝试解码该ByTestString的函数也将继续工作


这导致了大量的混乱和错误(只需在堆栈溢出上搜索
UnicodeEncodeError
UnicodeDecodeError
),因此在Python3中,类型是不纠缠的。

因为在Python2中,您需要在字节字符串(
str
对象)和Unicode字符串中处理文本(
unicode
对象)可交换、透明。当需要bytestring时,
unicode
对象被透明地编码(到ASCII),反之,当需要unicode时,
str
对象被透明地解码,再次假定为ASCII

因此
str.encode()
将首先解码,然后再次编码。或者
unicode.decode()
将首先编码,然后解码结果

只有当您的代码希望接受
str
unicode
对象并交换处理这些对象时,才可以使用此功能。因此,即使您传入仅包含ASCII码点的
unicode
对象,期望使用bytestring并尝试解码该bytestring的函数仍将继续工作


这导致了大量的混乱和错误(只需在堆栈溢出上搜索
UnicodeEncodeError
UnicodeDecodeError
),因此在Python3中,类型被解开了。

这是一个指示您切换到Python3:D的标志