首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >unicode_literals和type()

unicode_literals和type()
EN

Stack Overflow用户
提问于 2013-10-27 12:29:17
回答 1查看 4.1K关注 0票数 13

我在支持python2和python3的type()电话时遇到了问题。这说明了问题所在:

代码语言:javascript
复制
from __future__ import unicode_literals

name='FooClass'
type(name, (dict,), {})

在python3上没有问题,但是在python2上:

代码语言:javascript
复制
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编码成字节的.

看起来是这样的:

代码语言:javascript
复制
from __future__ import unicode_literals
import six

name='FooClass'
type(six.b(name), (dict,), {})

但是它在python2和python3上都失败了:

代码语言:javascript
复制
$ 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()提供一个包装器吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的一个超集,因此您应该不会介意)。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19618031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档