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。
答案 0 :(得分:11)
不,__all__
中不允许使用unicode值,因为在Python 2中,名称是字符串,而不是unicode值。
您确实必须对__all__
中的所有字符串进行编码,或者不使用unicode文字。您可以单独执行此操作:
__all__ = ['SomeClass']
__all__ = [n.encode('ascii') for n in __all__]
在Python 3中,变量名也是unicode值,因此期望期望具有unicode字符串。