0

シンプルなマルチレベル パッケージを作成しようとしています。

test_levels.py
level1/
        __init__.py (empty file)
        level2/
                __init__.py  (only contents: __all__ = ["leaf"])
                leaf.py

葉.py:

class Leaf(object):
    print("read Leaf class")
    pass

if __name__ == "__main__":
    x = Leaf()
    print("done")

test_levels.py:

from level1.level2 import *
x = Leaf()

leaf.py を直接実行すると正常に動作しますが、test_levels.py を実行すると、出力がないと予想していた以下の出力が返されます。

read Leaf class
Traceback (most recent call last):
  File "C:\Dev\intranet\test_levels.py", line 2, in <module>
    x = Leaf()
NameError: name 'Leaf' is not defined

誰かが私が間違っていることを指摘できますか?

4

3 に答える 3

0

そのパッケージ内のすべてのモジュールからすべての変数名をインポートすることを期待していますか?それは恐ろしい考えです。あなたがやりたいことをするために、それはあるべきです

from level1.level2.leaf import *

または、ワイルドカードのインポートを削除することをお勧めします。これは通常は悪いことですが、

from level1.level2.leaf import Leaf
于 2010-11-26T17:22:48.950 に答える
0

追加してみてください

from leaf import *

ファイル level1/level2/__init__.py 内

更新: 前のコメントのように、モジュール名の前にドットを追加し、「__all__」宣言を削除します。

$ cat level1/level2/__init__.py
from .leaf import Leaf
$ cat level1/level2/leaf.py
class Leaf:
    def __init__(self):
        print("hello")
$ cat test.py
from level1.level2 import *
x = Leaf()
$ python test.py
hello
于 2010-11-26T16:34:24.937 に答える
0

では、 (または、Py3k では)level1/level2/__init__.pyやりたいと思います。from leaf import *from .leaf import *

からインポートするとlevel1.level2、実際__init__.pyにはそのディレクトリにファイルがインポートされます。そこに定義Leafしていないので、それをインポートしても取得できません。

于 2010-11-26T16:34:41.667 に答える