7

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

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

但是,当我将类名转换为 str in 时__all__,它工作得很好。
[当我from mypackage import SomeClass在下面的 run.py 中指定时它也可以工作......因为其中的项目__all__没有被处理。]


我的包/somemodule.py:

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

class SomeClass(object):
    pass

我的包/ __init__.py

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

__all__ = ['SomeClass']

运行.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并将 init 中的所有字符串显式转换为带有u'uni string'.

4

1 回答 1

12

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

您确实必须对所有字符串进行编码__all__或不使用 unicode 文字。您可以将其作为一个单独的步骤进行:

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

在 Python 3 中,变量名也是 unicode 值,因此应该__all__有unicode 字符串。

于 2013-11-11T18:53:21.343 回答