我在type()调用时支持python2和python3时遇到问题.这证明了这个问题:
from __future__ import unicode_literals
name='FooClass'
type(name, (dict,), {})
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这与在Python 2.6中使用unicode_literals的Any gotchas有关吗?.在那个问题中,有人建议对一个字节串进行类型转换,所以天真地考虑使用six.b():
一个"假的"字节文字.数据应始终是正常的字符串文字.在Python 2中,b()返回一个8位字符串.在Python 3中,数据使用latin-1编码编码为字节.
所以它看起来像这样:
from __future__ import unicode_literals
import six
name='FooClass'
type(six.b(name), (dict,), {})
Run Code Online (Sandbox Code Playgroud)
但它在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 …Run Code Online (Sandbox Code Playgroud)