4

私はこの構造を持っているとしましょう。

MyApp
├── main.py
└── package
    ├── __init__.py
    ├── a.py
    ├── b.py
    ├── c.py
    ├── d.py
    ├── e.py
    ├── f.py
    ├── g.py
    ├── h.py
    ├── ...
    └── z.py

そして、私はからまでmain.pyのすべてのモジュールを使用する必要がありますa.pyz.py

これらすべてのモジュールを1つのインポートステートメントでインポートする方法を知りたいのですが。

だからする代わりに

from package import a
from package import b
...
from package import z

パッケージをインポートして、すべてのモジュールを準備することができます。

私が試したこと

import package
a = package.a.A()
# AttributeError: 'module' object has no attribute 'a'

__init__.pyこれで、すべてのモジュールをに追加するコードを挿入できることがわかり__all__ましたが、私が読んだことから、「パッケージのインポートから*」は避ける必要があります。

これは、パッケージに含まれるモジュールの数が増える可能性があるため、モジュールが作成されるたびにメインコードにインポートステートメントを追加したいためです。理想的には、モジュールをパッケージにドロップして、すぐに使用できるようにしたいと思います。

4

4 に答える 4

4

__init__.py、次のことができます。

import a, b, c, d...

その後、モジュールはpackage名前空間に配置されますimport package

main.pyの名前空間に、などの名前を付けたいのですが、これを簡単に行うことができます。これは避けられaません。それらをすべて暗黙的にインポートする他の方法は、明示的にインポートしない名前で名前空間を汚染することを伴うため、同様に悪い結果になります。bfrom package import *

于 2012-06-14T19:05:32.873 に答える
2

あなたが提案するのは、必要なものではなくすべてをインポートするので、非常に悪い設計慣行です。一般に、ITはプログラムのロードを遅くします-本当に必要でない場合は絶対に実行しないでください。また、時間の浪費であるため、モジュールで使用されていない変数を初期化しないでください。

正しく使用しないと、適切な設計手法に従わない2つの解決策。

この回答を確認してください誰かがPythonで__all__を説明できますか?

__import__また、モジュールをos.path.dirname(__file__)ロードしたり、ディレクトリ内のすべてのファイル名を一覧表示したり、モジュールとしてロードしたりするために使用することもできます。

ところで、このパターンは、何でもロードできるため、深刻なセキュリティホールにつながります。セキュリティを破るには、作成権限のみが必要です。

于 2012-06-14T19:18:05.810 に答える
2

これを行わないことをお勧めします。必要に応じて、これは私が過去に使用した方法です。

# __init__.py

import os
import re

PACKAGE = 'MyApp.package'
MODULE_RE = r"^.*.py$"

for filename in os.listdir(os.path.dirname(__file__)):
  if not re.match(MODULE_RE, filename) or filename == "__init__.py":
    continue

  imported_module = __import__('%s.%s' % (PACKAGE, filename[:-3]),
                               {}, {},
                               filename[:-3])
于 2012-06-14T19:18:37.107 に答える
1

このコードはあまり美しくありませんが、良い回避策だと思います

import os

for i in os.listdir('package'):
    if i.endswith('.py') and not i.startswith('__'):
        exec('from package import ' + i[:-3])
于 2012-06-14T19:11:38.340 に答える