7

__all__Python 2.7.5ではUnicodeリテラルは許可されていませんか? utf-8のコーディングとともに、上部に__init__.pyファイルがあります。from __future__ import unicode_literals(その中にはいくつかの Unicode 文字列も含まれているため、将来のインポートになります。)

を使用してインポートしたときに一部のモジュールのみが表示されるようにするためにfrom mypackage import *、クラスを に追加しました__all__。しかし、私は得るTypeError: Item in ``from list'' not a string。何故ですか?バグ?

ただし、クラス名を str にキャストすると__all__、問題なく動作します。
[from mypackage import SomeClass以下の run.py で指定した場合にも機能します... のアイテム__all__は処理されないためです。]


mypackage/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']

run.py:

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

print('yay')

エラーを回避するために、「all」宣言を次のように変更します。

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

もちろん、これについて pylint は不平を言っています。

私の他のオプションは、 init のすべての文字列をインポートせunicode_literals、明示的にユニコードにキャストすることu'uni string'です.

4

1 に答える 1

12

いいえ、Unicode 値は では許可されていません。Python __all__2 では、名前は文字列であり、Unicode 値ではないためです。

実際、すべての文字列をエンコードする__all__か、Unicode リテラルを使用しない必要があります。別のステップとしてこれを行うことができます:

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

Python 3 では、変数名も Unicode 値であるため、Unicode 文字列を持つこと__all__期待されます。

于 2013-11-11T18:53:21.343 に答える