gpt4 book ai didi

python - unicode_literals 和 type()

转载 作者:太空狗 更新时间:2023-10-29 17:45:59 25 4
gpt4 key购买 nike

我在 type() 调用中遇到支持 python2 和 python3 的问题。这说明了问题:

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

这与 Any gotchas using unicode_literals in Python 2.6? 有关.在那个问题中,有人建议将类型转换为字节串,所以我天真地考虑使用 six.b() :

A “fake” bytes literal. data should always be a normal string literal. In Python 2, b() returns a 8-bit string. In Python 3, data is encoded with the latin-1 encoding to bytes.

所以看起来像这样:

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,它是一个 python2 unicode 字符串在 python3 上。

你怎么看?

有什么我不明白的吗?

或者在 python 2 和 3 上与 type() 真的不兼容吗?

难道没有任何方法来让相同的 type() 调用同时支持 2 和 3 吗?

在这种情况下,像 six 这样的工具不应该为 type() 提供包装器吗?

最佳答案

six.b 是在您不会使用 unicode_literals 的假设下编写的(并且您将向其传递一个字符串文字,如文档所述) ,因此 Python 2 实现只是 def b(s): return s,因为 Python 2 字符串文字已经是字节字符串。

要么不要在该模块中使用 unicode_literals,要么使用(如注释所建议的)str(name)。在 Python 3 中,这是一个空操作。在 Python 2 中,它会默默地将 unicode 字符串转换为字节字符串(假设是一些我懒得记住的编码,但它是 ASCII 的超集,所以你应该没问题)。

关于python - unicode_literals 和 type(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19618031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com