我在支持python2和python3的type()电话时遇到了问题。这说明了问题所在:
from __future__ import unicode_literals
name='FooClass'
type(name, (dict,), {})在python3上没有问题,但是在python2上:
Traceback (most recent call last):
File "test.py", line 6, in <module>
type(name, (dict,), {})
TypeError: type() argument 1 must be string, not unicode这与literals in Python 2.6?有关。在这个问题中,有人建议将类型转换为字节串,所以我天真地考虑使用six.b()。
一个“假的”字节文字。数据应该始终是一个正常的字符串文本。在Python 2中,b()返回一个8位字符串。在Python 3中,数据是用拉丁文-1编码成字节的.
看起来是这样的:
from __future__ import unicode_literals
import six
name='FooClass'
type(six.b(name), (dict,), {})但是它在python2和python3上都失败了:
$ python2 test.py
Traceback (most recent call last):
File "test.py", line 6, in <module>
type(six.b(name), (dict,), {})
TypeError: type() argument 1 must be string, not unicode
$ python3 test.py
Traceback (most recent call last):
File "test.py", line 6, in <module>
type(six.b(name), (dict,), {})
TypeError: type() argument 1 must be str, not bytes看来确实是,type()想要一个python2 str,它是python2上的python3字节串,但是它想要python3 str,它是python3上的python2 unicode字符串。
你觉得呢?
有什么我不明白的吗?
或者,在python 2和3上是否存在与type()的真正不兼容?
难道没有办法让同一个type()调用同时支持2和3吗?
在这种情况下,像six这样的工具不应该为type()提供一个包装器吗?
发布于 2013-10-27 12:40:03
six.b是在这样的假设下编写的,即您不会使用unicode_literals (并且您将向它传递字符串文字,正如文档所述),所以Python2实现只是def b(s): return s,因为Python2String文字已经是一个字节字符串了。
要么在这个模块中不使用unicode_literals,要么使用(如注释所示) str(name)。在Python 3中,这是没有操作的。在Python 2中,它静默地将unicode字符串转换为字节字符串(假设某些编码我无法记住,但它是ASCII的一个超集,因此您应该不会介意)。
https://stackoverflow.com/questions/19618031
复制相似问题