对于包的`__init__`,`__ all__`中没有Unicode?

时间:2013-11-11 18:51:49

标签: python python-2.7 unicode python-import

Python 2.7.5中的__all__中是否不允许使用Unicode文字?我在顶部有一个__init__.py文件from __future__ import unicode_literals,以及编码utf-8。 (其中还有一些unicode字符串,因此将来会导入。)

为了确保在使用from mypackage import *导入时只有部分模块可见,我已将我的课程添加到__all__。但我得到TypeError: Item in ``from list'' not a string。这是为什么?错误?

然而,当我在__all__中将类名转换为str时,它的工作正常 [当我在下面的run.py中指定from mypackage import SomeClass时它也有效...因为__all__中的项目未被处理。 ]


mypackage的/ somemodule.py:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

class SomeClass(object):
    pass

mypackage / __init__。py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from .somemodule import SomeClass

__all__ = ['SomeClass']

run.py:

# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from mypackage import *

print('yay')

为避免错误,我改变了所有'声明:

__all__ = [str('SomeClass')] #pylint: disable=invalid-all-object

当然,pylint抱怨。

我的另一个选择是导入unicode_literals并使用u'uni string'将init中的所有字符串显式地转换为unicode。

1 个答案:

答案 0 :(得分:11)

不,__all__中不允许使用unicode值,因为在Python 2中,名称是字符串,而不是unicode值。

您确实必须对__all__中的所有字符串进行编码,或者不使用unicode文字。您可以单独执行此操作:

__all__ = ['SomeClass']
__all__ = [n.encode('ascii') for n in __all__]

在Python 3中,变量名也是unicode值,因此期望期望具有unicode字符串。