12

ディレクトリ構造:

main.py
my_modules/
   module1.py
   module2.py

module1.py:

class fooBar():
    ....
class pew_pew_FooBarr()
    ....
...

すべてのクラスを module* から main にプレフィックスなしで追加するにはどうすればよいですか (つまり、それらを foo = my_modules.module1.fooBar() ではなく foo = fooBar() のように使用するには)。

明らかな決定は、次のように main.py に記述することです。

from my_modules.module1 import *
from my_modules.module2 import *
from my_modules.module3 import *
...

しかし、新しいmoduleNを作成するときにmain.pyを変更したくありません。その解決策はありますか?

このようなクラスをインポートするのは良い考えではないことはわかっていますが、それでも気になります。

UPD: この質問は、このLoading all modules in a folder in Pythonとは異なります。私の問題は名前空間なしでモジュールをロードすることだからです。

4

1 に答える 1

33

my_modulesフォルダにファイルを追加して__init__.py、適切なパッケージにします。そのファイルでは、これらの各モジュールのグローバルをファイルのグローバル スコープに挿入でき__init__.pyます。これにより、モジュールがインポートされたときにそれらを使用できるようになります (__all__変数にグローバルの名前も追加した後)。

__all__ = []

import pkgutil
import inspect

for loader, name, is_pkg in pkgutil.walk_packages(__path__):
    module = loader.find_module(name).load_module(name)

    for name, value in inspect.getmembers(module):
        if name.startswith('__'):
            continue

        globals()[name] = value
        __all__.append(name)

今、代わりに:

from my_modules.class1 import Stuff

あなたはただ行うことができます:

from my_modules import Stuff

または、すべてをグローバルスコープにインポートします。これは、あなたがやりたいことのようです:

from my_modules import *

このアプローチの問題は、クラスが互いに上書きすることです。そのため、2 つのモジュールが を提供する場合Foo、最後にインポートされたものしか使用できなくなります。

于 2013-05-31T08:56:06.213 に答える